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


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
вычисление длины только один раз, вероятно, хорошая идея, я хочу добавить 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
Милсон - в таком случае, это не совсем «ключ»
Триптих



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.