Javascript 如何从对象检索动态变量

Javascript 如何从对象检索动态变量,javascript,arrays,underscore.js,Javascript,Arrays,Underscore.js,我有一个js对象,如下所示: var detailsArray = [ {a0 :1, b0 :'A'}, {a1 :2, b1 :'B'},

我有一个js对象,如下所示:

            var detailsArray = [
                                 {a0 :1,
                                  b0 :'A'},
                                 {a1 :2,
                                  b1 :'B'},
                                 {a2 :3,
                                  b2 :'C'},
                                 {a3 :4,
                                  b3 :'D'}];
          var variableA = new Array();
          for(var i = 0;i<detailsArray.length;i++){
            var temp = 'a' + i;
            variableA[i] = _.pluck(detailsArray,temp);
          }              
这就是从服务器端创建对象的方式。在客户端,我希望检索所有“a”的值并将它们添加到数组中。问题在于,变量名会随着索引号的不同而变化。我曾尝试使用下划线.js执行以下操作:

            var detailsArray = [
                                 {a0 :1,
                                  b0 :'A'},
                                 {a1 :2,
                                  b1 :'B'},
                                 {a2 :3,
                                  b2 :'C'},
                                 {a3 :4,
                                  b3 :'D'}];
          var variableA = new Array();
          for(var i = 0;i<detailsArray.length;i++){
            var temp = 'a' + i;
            variableA[i] = _.pluck(detailsArray,temp);
          }              
var variableA=新数组();

对于(var i=0;i,这里有一个可能的实现

var tmp = []; 
for (var i = 0; i < detailsArray.length; i++) { 
   var obj = detailsArray[i]; // current object at index
   for (var props in obj) { // iterate properties in current object
       if (props.charAt() == "a") { // if starts with a....
           tmp.push(obj[props]);  // add value to array
           break; // stop the property iteration and move to next object
        }
   } 
}
console.log(tmp); // [1,2,3,4]
var tmp=[];
对于(var i=0;i
这里有一个可能的实现

var tmp = []; 
for (var i = 0; i < detailsArray.length; i++) { 
   var obj = detailsArray[i]; // current object at index
   for (var props in obj) { // iterate properties in current object
       if (props.charAt() == "a") { // if starts with a....
           tmp.push(obj[props]);  // add value to array
           break; // stop the property iteration and move to next object
        }
   } 
}
console.log(tmp); // [1,2,3,4]
var tmp=[];
对于(var i=0;i
有两种方法可以访问javascript中对象的属性:像刚才那样使用点,或者使用数组语法样式

var obj = {'a':5};

obj.a
obj['a']
因此,对于您的代码,这将给出:

var variableA = new Array();
for(var i = 0;i<detailsArray.length;i++){
    variableA[i] = detailsArray[i]['a' + i];
}
var variableA=新数组();

对于(var i=0;i,有两种方法可以访问javascript中对象的属性:像刚才那样使用点,或者使用数组语法样式

var obj = {'a':5};

obj.a
obj['a']
因此,对于您的代码,这将给出:

var variableA = new Array();
for(var i = 0;i<detailsArray.length;i++){
    variableA[i] = detailsArray[i]['a' + i];
}
var variableA=新数组();

对于(var i=0;i您也可以这样做:

for (var i = 0; i < detailsArray.length; i++)
  alert(eval("detailsArray[" + i + "].a" + i));
for(var i=0;i
我提供的代码将
alert
与json数组中as对应的所有值,但显然,您可以使用获得的值执行任何操作


在这里,我计算所有钥匙都是smth类型的,但我认为这是一个安全的假设。

您也可以这样做:

for (var i = 0; i < detailsArray.length; i++)
  alert(eval("detailsArray[" + i + "].a" + i));
for(var i=0;i
我提供的代码将
alert
与json数组中as对应的所有值,但显然,您可以使用获得的值执行任何操作


在这里,我计算所有的键都是smth类型的,但我认为这是一个安全的假设。

使用下划线,您可以:

_.reduce(_.map(detailsArray, function(o, i) {
    return o['a' + i];
}), function(a, b) {
    return a + b;
});
在较新的浏览器中使用本机JS:

detailsArray.map(function(o, i) {
    return o['a' + i];
}).reduce(function(a, b) {
    return a + b;
});

使用下划线,您可以执行以下操作:

_.reduce(_.map(detailsArray, function(o, i) {
    return o['a' + i];
}), function(a, b) {
    return a + b;
});
在较新的浏览器中使用本机JS:

detailsArray.map(function(o, i) {
    return o['a' + i];
}).reduce(function(a, b) {
    return a + b;
});

如果数组中的对象的顺序不符合您的期望,那么会怎样?如果第一个a属性从10开始会怎样?您将什么都没有,然后我回应了作者的要求,特别是关于这一点:“问题是变量名根据索引号而变化”如果数组中的对象的顺序不符合您的期望,那么会怎样?如果第一个a属性从10开始会怎样?您将什么都没有,然后我回应了作者的要求,特别是关于这一点:“问题是变量名根据索引号而变化”这太可怕了。你为什么需要评估?你可以只做
alert(detailsArray[i]['a'+i])
。但说真的,不要这样做that@TheBrain谢谢你的反馈。为什么
eval
很糟糕?说真的-我根本不是js高手,可能我在这里遗漏了一些东西。@BorisStrandjev:在这种情况下,
detailsArray[I]['a'+i]
做同样的工作,看起来更干净。一般来说,应该避免使用
eval
,因为它会使调试变得更困难,并引入可能的XSS风险。@BorisStrandjev:可能吧。那太可怕了。为什么需要eval?你可以只做
警报(detailsArray[a'+i])
。但说真的,不要这样做that@TheBrain谢谢你的反馈。为什么
eval
很糟糕?说真的-我根本不是js高手,可能我在这里遗漏了什么。@BorisStrandjev:在这种情况下,
detailsArray[I]['a'+I]
做同样的工作,看起来更干净。一般来说,应该避免使用
eval
,因为它会使调试变得更困难,并引入可能的XSS风险。@BorisStrandjev:可能吧。