2013-04-15 3 views
0

У меня есть объект JS, который выглядит следующим образом:Как получить динамическую переменную из объекта

  var detailsArray = [ 
           {a0 :1, 
            b0 :'A'}, 
           {a1 :2, 
            b1 :'B'}, 
           {a2 :3, 
            b2 :'C'}, 
           {a3 :4, 
            b3 :'D'}]; 

Это как объект создается на стороне сервера. На стороне клиента я хочу получить значение всех «а» и добавить их в массив. Проблема в том, что имя переменной меняется в зависимости от номера индекса. Я попытался использовать underscore.js, чтобы сделать что-то вроде этого:

  var variableA = new Array(); 
      for(var i = 0;i<detailsArray.length;i++){ 
      var temp = 'a' + i; 
      variableA[i] = _.pluck(detailsArray,temp); 
      }    

Но это не работает. Может ли кто-нибудь сказать, как получить значения?

ответ

3

Существует два способа доступа к свойствам объекта в 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]; 
} 
+0

если объекты внутри массива не в порядке, вы ожидаете, что тогда? что, если первое свойство начинается с 10? у вас ничего не будет – TheBrain

+0

Я отвечаю на то, что автор просил, особенно об этом: «Проблема в том, что имя переменной меняется в зависимости от номера индекса« – Brugnar

0

вот один из возможных вариантов реализации

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] 
0

Вы также можете сделать это так:

for (var i = 0; i < detailsArray.length; i++) 
    alert(eval("detailsArray[" + i + "].a" + i)); 

код я обеспечиваю будет alert все значения, соответствующего как в массиве json, но, очевидно, вы можете делать все, что хотите, с полученными значениями.

Здесь я считаю, что все ключи будут такого рода, но я полагаю, что это безопасное предположение.

+0

, что так ужасно. зачем вам нужен eval? вы можете просто выполнить команду alert (detailsArray [i] ['a' + i]) '. Но серьезно. Не делайте этого – TheBrain

+0

@TheBrain Спасибо за отзыв. Почему «eval» ужасен? серьезно - я вообще не владею js и, вероятно, здесь что-то не хватает. –

+0

@BorisStrandjev: В этом случае 'detailsArray [i] ['a' + i]' выполняет ту же работу и выглядит более чистым. В общем, следует избегать 'eval', потому что это затрудняет отладку и создает возможные риски XSS. – Blender

1

С подчеркиванием, вы могли бы сделать:

_.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; 
}); 
Смежные вопросы