Javascript 如何从对象检索动态变量
我有一个js对象,如下所示:Javascript 如何从对象检索动态变量,javascript,arrays,underscore.js,Javascript,Arrays,Underscore.js,我有一个js对象,如下所示: var detailsArray = [ {a0 :1, b0 :'A'}, {a1 :2, b1 :'B'},
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:可能吧。