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


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.