【问题标题】:Change namespaced array name inside function using argument in JavaScript使用 JavaScript 中的参数更改函数内的命名空间数组名称
【发布时间】:2014-08-06 00:19:44
【问题描述】:

这个问题看起来有点像this one,但它并没有解决我的问题。

我有一个命名空间的对象数组,例如 color.bluecolor 是命名空间,blue 是对象数组),我需要这样做:

var color = {
    red:[],
    blue:[]
}

function foo(arg){
    for(var i = 0; i < arg.length; i++){
        color.arg[i].push(obj);
    }
}

所以我可以通过调用此函数将obj 对象添加到对象的命名空间数组中,但此代码会引发错误[Error] TypeError: undefined is not an object (evaluating 'color.arg[i]')。我什至尝试过使用eval()(成功),但我想避免缓慢/邪恶的代码。 有人可以帮我吗?

请注意,我不想在函数的参数中写命名空间,只是“红色”或“蓝色”

Here's a JSFiddle。我想添加 console.log 以打印 ["abc"] 而无需在函数参数中输入命名空间。

【问题讨论】:

  • color[arg[i]].push(obj);

标签: javascript function namespaces


【解决方案1】:

用途:

color[arg[i]].push(obj);

color.arg 实际上是在color 中寻找一个名为arg 的属性。相反,您希望它使用 arg 中的名称引用属性,这就是括号符号的用途。

因此,例如,如果arg == ["red", "green", "blue"],那么color[arg[2]] 将指向与color.blue 相同的属性。

【讨论】:

    【解决方案2】:

    对象color 没有名为arg 的成员。而不是:

    color.arg[i].push(obj)
    

    ...你可能想要:

    var colorName = arg[i];
    color[colorName].push(obj);
    

    【讨论】:

      【解决方案3】:

      如果属性名称来自变量,则需要括号语法来选择它:

      for (var i = 0; i < arg.length; i++) {
          if (color.hasOwnProperty(arg[i])) {
              color[arg[i]].push(obj);
          }
      }
      

      附加条件可防止在您执行foo('orange'); 时发生错误

      更新

      var color = {
          red: []
      }, obj = "abc";
      
      function addObjToArray(arr){
          color[arr].push(obj);
      }
      addObjToArray(red);
      
      console.log(color.red);
      

      在代码中,addObjToArray() 使用未初始化的变量 red 调用;您需要使用字符串文字:

      addObjToArray('red');
      

      Demo

      【讨论】:

      • 我想我没有正确解释我的问题,然后我创建了一个小提琴:jsfiddle.net/Y2e8E 我希望 console.log 打印 ["abc"] 而不在函数参数。
      • @TiagoMarinho 更新了我的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-15
      • 1970-01-01
      • 2020-06-27
      • 1970-01-01
      • 2011-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多