Как создать массив литералов объекта в цикле?

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

codecowboy
источник

Ответы:

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
    });
}
RaYell
источник
18
Вы можете пропустить var obj = {бит, просто нажмите сам литерал.
Питер Бейли
3
вычисление длины только один раз, вероятно, хорошая идея, я хочу добавить a, 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?
названия
хороший ответ, долго искал, как получить доступ к информации, спасибо
thatOneGuy
Что делать, если ключ должен быть более одного раза! ['Заметки'] могут встречаться более одного раза, тогда что мы можем сделать?
Милсон
1
Милсон - в таком случае, это не совсем «ключ»
Триптих
13

Вы можете сделать что-то подобное в ES6.

new Array(10).fill().map((e,i) => {
   return {idx: i}
});
тетра мастер
источник
12

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

var arr = oFullResponse.results.map(obj => ({
    key: obj.label,
    sortable: true,
    resizeable: true
}))
Бесконечный
источник
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)));
}
JPIyo
источник
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};
}
BenM
источник
3
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
Интересное обсуждение [] против нового Array () stackoverflow.com/questions/7375120/…
Адриан П.