2009-08-17 2 views
190

мне нужно создать массив объектов литералов следующим образом:Как создать массив объектных литералов в цикле?

var myColumnDefs = [ 
    {key:"label", sortable:true, resizeable:true}, 
    {key:"notes", sortable:true,resizeable:true},...... 

В цикле, как это:

for (var i = 0; i < oFullResponse.results.length; i++) { 
    console.log(oFullResponse.results[i].label); 
} 

Значение key должно быть в каждом элементе массива results[i].label.

ответ

334
var arr = []; 
var len = oFullResponse.results.length; 
for (var i = 0; i < len; i++) { 
    arr.push({ 
     key: oFullResponse.results[i].label, 
     sortable: true, 
     resizeable: true 
    }); 
} 
+16

вы можете пропустить 'уаг OBJ = {' бит, просто нажмите буквальным сам. –

+0

Я бы вычислил 'length' только один раз. – kangax

+3

Расчет длины только один раз, вероятно, хорошая идея, я решил добавить «var obj», чтобы сделать код более понятным, конечно, вы можете пропустить его, вы можете написать весь скрипт в одной строке, если хотите :) – RaYell

2

Я создал массив, а затем добавлю к нему литералы объектов.

var myColumnDefs = []; 

for (var i=0 ; i < oFullResponse.results.length; i++) { 

    console.log(oFullResponse.results[i].label); 
    myColumnDefs[myColumnDefs.length] = {key:oFullResponse.results[i].label, sortable:true, resizeable:true}; 
} 
2
var myColumnDefs = new Array(); 

for (var i = 0; i < oFullResponse.results.length; i++) { 
    myColumnDefs.push({key:oFullResponse.results[i].label, sortable:true, resizeable:true}); 
} 
+7

Лучше инициализировать массив, используя '[]' вместо 'new Array()'. – RaYell

+0

Интересное обсуждение [] vs. new Array() http://stackoverflow.com/questions/7375120/why-is-arr-faster-than-arr-new-array –

51

ответ RaYell является хорошим - это ответ на ваш вопрос.

Мне кажется, что, хотя вы действительно должны создать объект заклиненных этикеток с подобъектами в качестве значений:

var columns = {}; 
for (var i = 0; i < oFullResponse.results.length; i++) { 
    var key = oFullResponse.results[i].label; 
    columns[key] = { 
     sortable: true, 
     resizeable: true 
    }; 
} 

// Now you can access column info like this. 
columns['notes'].resizeable; 

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

+1

Вау, спасибо! –

+0

+1, поскольку ключевое решение имеет больше смысла и помогает мне с моими потребностями :) –

+0

похоже, что вам не хватает полуколонии после установки ключа var? – superUntitled

4

Это будет работать:

var myColumnDefs = new Object(); 
for (var i = 0; i < oFullResponse.results.length; i++) { 
    myColumnDefs[i] = ({key:oFullResponse.results[i].label, sortable:true, resizeable:true}); 
    } 
5

В той же идее Ник Риггс, но я создать конструктор, и толчке новый объект в массиве, используя его. Это избежать повторения ключей класса:

var arr = []; 
var columnDefs = function(key, sortable, resizeable){ 
    this.key = key; 
    this.sortable = sortable; 
    this.resizeable = resizeable; 
    }; 

for (var i = 0; i < len; i++) { 
    arr.push((new columnDefs(oFullResponse.results[i].label,true,true))); 
} 
4

Это то, что Array#map хороши в

var arr = oFullResponse.results.map(obj => ({ 
    key: obj.label, 
    sortable: true, 
    resizeable: true 
})) 
Смежные вопросы