Як створити масив об'єктних літералів у циклі?


224

Мені потрібно створити масив об’єктних літералів на кшталт цього:

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в кожному елементі масиву.

Відповіді:


395
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
    });
}

18
ви можете пропустити var obj = {біт, просто натисніть на себе буквально.
Пітер Бейлі

3
вирахування довжини лише один раз, мабуть, хороша ідея, я вирішу додати var objкод, щоб зробити код більш зрозумілим, звичайно, ви можете пропустити його, ви можете написати весь сценарій в один рядок, якщо хочете :)
RaYell

3
@kangax, довжина не "обчислена", це операція O (1).
Триптих

8
@Triptych - Так, але ви шукаєте пошук властивостей, що виконуються з кожною ітерацією, яка не є безкоштовною і якої можна уникнути. Мікрооптимізація? Можливо. Крім того, це "живе" значення - якщо ви модифікуєте масив у циклі, довжина змінюватиметься для послідовних ітерацій, які можуть призвести до нескінченності. Подаруйте це на youtube.com/watch?v=mHtdZgou0qU
Пітер Бейлі

2
Так, але ви не змінюєте масив кожної ітерації. Якби ви були, було б смішно порівнювати з довжиною в будь-якому випадку в більшості випадків.
Триптих

61

Відповідь 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, оскільки ключове рішення має більше сенсу та допомагає мені в задоволенні моїх потреб :)
winner_joiner

схоже, вам не вистачає напівкрапки після встановлення ключа var?
superUntitled

приємна відповідь, шукаю, як отримати доступ до інформації на деякий час, дякую
thatOneGuy

що робити, якщо ключ повинен бути не один раз! ["замітки"] можуть траплятися не раз, то що ми можемо зробити?
Мілсон

1
Мілсон - у цьому випадку це насправді не "ключ"
Триптих



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});
  }

4

У тій же ідеї Ніка Ріггса, але я створюю конструктор і натискаю новий об’єкт у масиві, використовуючи його. Це уникає повторення клавіш класу:

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)));
}

3

Я б створив масив, а потім додав би до нього об'єктні літерали.

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};
}


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.