2010-09-14 2 views
1

У меня есть объект JavaScript, к которому я хотел бы добавить некоторые свойства, но я не знаю, каковы имена свойств до выполнения.Объект JavaScript - добавить собственность без использования eval?

Могу ли я сделать это без использования eval? Если да, то как?

var get_params = new Object(); 
var params = {'name':'john', 'age':'23'}; //actually not known until runtime 
for (var i=0, len=params.length; i<len; ++i){             
     get_params.p[0] = p[1]; //How can I set p[0] as the object property? 
    } 
} 
+2

Я уверен, что вы просто набрали слишком быстро, но синтаксис для объекта - {}, а не []. :) – einarmagnus

+0

Трудно сказать, какой результат вы после. Таурен догадывался о вашем желаемом результате, который кажется правдоподобным, но тогда предположение о том, что 'params' является объектом, кажется еще более правдоподобным, и тогда результат будет таким же, как и то, с чего вы начали! Вы действительно должны уточнить, какой ответ вы хотите. что вы подразумеваете под 'p [1]'? 'p' не существует в вашем коде ... –

+0

Цикл for заставляет меня думать, что он действительно хочет массив, а не объект. В противном случае он должен использовать 'for (var i in params)'. – Tauren

ответ

1

Поскольку ваш пример кода имеет искаженный массив, я буду включать 2 варианта.

Вариант 1 (PARAMS является актуальной задачей, а не массив):

var get_params = {}; // prefer literal over Object constructors. 

var params = {'name':'john', 'age':'23'}; // @runtime (as object literal) 

for (var key in params){ 
    if(params.hasOwnProperty(key)) { // so we dont copy native props 
     get_params[key] = params[key]; 
    } 
} 

Вариант 2 (пары представляет собой массив, содержащий объекты):

var get_params = {}; // prefer literal over Object constructors. 

var params = [{'name':'john'},{'age':'23'}]; // @runtime (as array literal) 

for(var i=0,param;param=params[i];i++) { 
    for (var key in param){ 
     if(param.hasOwnProperty(key)) { 
      get_params[key] = param[key]; 
     } 
    } 
} 

Наслаждайтесь.

+0

Итак, первое решение в основном дает вам то же самое, что и params. В чем смысл, почему бы просто не использовать значение самих параметров? Второе решение ** появляется **, чтобы работать нормально, но на самом деле есть ссылка на неопределенный элемент в массиве, когда i = 2. Это решение зависит от того, что javascript выгнал вас из цикла for, потому что вы пытаетесь ссылаться на params [2], который является несуществующим элементом. Как я уже сказал, это работает, но я не хочу этого делать. – Tauren

0
var get_params = {}; 
var params = [{'name':'john'}, {'age':'23'}]; 
for (var i=0,len=params.length; i<len; ++i){ 
    for (var p in params[i]) { 
     if(params[i].hasOwnProperty(p)) { 
     get_params[p] = params[i][p]; 
     } 
    } 
} 

Хорошо, это моя третья версия. Я думаю, что он будет делать то, что я понимаю, вы хотите. Однако вид запутанности, и, вероятно, есть более оптимальные форматы для вашего динамического массива. Если я понимаю, что вы хотите сделать правильно, это должно сработать. В основном, это создает следующий объект:

get_params = { 
    name: "john", 
    age: "23" 
} 
+0

Это тоже не работает. Здесь 'p' - объект - например,' {'name': 'john'} '- и' p [0] 'не существует. Я уверен, что OP означает, что params должен быть '{'name': 'john', 'age': '23'}', и в этом случае ваше оригинальное решение было ближе, но не правильно. Это только я догадываюсь, но в любом случае это не работает. Результатом будет в настоящее время 'get_params = {undefined: undefined}' –

+0

Ahh, справа. Немного сложнее, но, безусловно, разрешимо ... – Tauren

+0

@David: Думаю, последняя версия будет работать. Без каких-либо подробностей от OP это так хорошо, как и получается. – Tauren

1

Вы можете получить доступ к объектам через object['someKey'], а также.

Смежные вопросы