루프에서 객체 리터럴 배열을 만드는 방법은 무엇입니까?


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. 코드를 더 명확하게하기 위해 a를 추가하기 로 선택합니다. 물론 건너 뛸 수 있습니다. 원하는 경우 전체 스크립트를 한 줄로 작성할 수 있습니다 :)
RaYell

3
@kangax, 길이는 "계산되지 않음", O (1) 연산입니다.
삼부작

8
@Triptych-그렇습니다. 그러나 각 반복마다 실행하는 속성 조회이므로 무료가 아니며 피할 수 있습니다. 미세 최적화? 혹시. 또한 "실시간"값입니다. 루프에서 배열을 수정하면 연속 반복시 길이가 변경되어 무한대로 이어질 수 있습니다. 이 시계를 youtube.com/watch?v=mHtdZgou0qU
Peter Bailey

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;

위의 접근 방식은 각 액세스에 대한 키를 전체 객체 배열에서 검색하는 것보다 훨씬 빠르고 관용적이어야합니다.


하나는 키 솔루션 때문에 더 의미가 도움 나 : 내 요구와 수
winner_joiner

var 키를 설정 한 후 세미콜론이 누락 된 것 같습니다.
superUntitled

좋은 답변, 잠시 동안 정보에 액세스하는 방법을 찾고, 감사합니다
thatOneGuy

키가 두 번 이상 필요한 경우 어떻게해야합니까! [ '노트']는 두 번 이상 발생할 수 있으며 우리는 무엇을 할 수 있습니까?
Milson

1
Milson-이 경우에는 실제로 "핵심"이 아닙니다
Triptych

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

Nick Riggs와 같은 생각이지만 생성자를 만들고 배열을 사용하여 배열에 새 객체를 푸시합니다. 클래스 키의 반복을 피하십시오.

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

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

흥미로운 토론 [] vs. 새로운 Array () stackoverflow.com/questions/7375120/…
Adrian P.

2

ES6으로 @tetra보다 더 나아가고 싶다면 Object spread 구문을 사용하여 다음과 같이 할 수 있습니다 .

let john = {
    firstName: "John",
    lastName: "Doe",
};

let people = new Array(10).fill().map((e, i) => {(...john, id: i});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.