首页 > 解决方案 > 在javascript中使用动态键名推送数组值

问题描述

我正在使用一个函数将值推送到具有两个参数的数组。在此第二个参数指示数组的级别。所以我需要使用此level参数值将值推送到该数组。

这是我的代码:

addLevel1(i, level) {
        let advArr1                                 =   {};
        let nextLevel                               =   parseInt(level)+1
        advArr1["level"+level+"_adv_url"]           =   "";
        advArr1["level"+level+"_custom_variables"]  =   "";
        advArr1["level"+level+"_percentage"]        =   "";
        advArr1["level"+level+"_status"]            =   "";
        advArr1["level"+nextLevel]                  =   [];
        this.containers[i].level1.push(advArr1);
        console.log(this.containers);
};

在这个插入

this.containers[i].level1.push(advArr1);

我需要level1的动态值。即如果参数级别为 1 它应该是

this.containers[i].level1.push(advArr1);

如果参数级别为2,它将是

this.containers[i].level2.push(advArr1);

标签: javascripttypescript

解决方案


对象的意义在于,您可以通过名称轻松查找属性。当您将动态级别变量混入其中时,您会破坏该目的:

  const levels = [
   { level1_status: "ok" },
   { level2_status: "wrong" }
 ];

 for(const level of levels) {
   // How to get the status here?
   level["level" + /*How to get the level?*/ "_status"]
 }

现在,您应该有静态键,所以所有级别都应该有相同的键。要区分不同的级别,您可以使用level 属性

  const levels = [
   { level: 1, status: "ok" },
   { level: 2, status: "wrong" }
  ];

  for(const level of levels) {
    console.log("Level:", level.level); // isn't that simple?

    console.log("has Status:", level.status); // Wohoo!
  }

现在接下来的事情是containers[i].level1:如果levels容器上有一个数组属性,则可以containers[i].levels[1]毫无问题地访问它。主要的好处是,您现在可以轻松地遍历容器的不同级别:for(const level of container.levels).

在容器有这样一个数组的假设下,您的代码可能是:

 addLevel(i, level){
    this.containers[i].levels[level] = {
      level,
      nextLevel: level + 1,
      advUrl: "",
      percentage: 0, // does make more sense than a string, right?
       status: "",
   };
 }

 // somewhere:
 context.addLevel(/*i*/ 0, /*level*/ 1);

推荐阅读