[javascript] 객체 배열 선언

배열 인 변수가 있고 배열의 모든 요소가 기본적으로 개체로 작동하기를 원합니다. 이를 달성하기 위해 코드에서 이와 같은 작업을 수행 할 수 있습니다.

var sample = new Array();
sample[0] = new Object();
sample[1] = new Object();

이것은 잘 작동하지만 색인 번호를 언급하고 싶지 않습니다. 내 배열의 모든 요소가 객체가되기를 원합니다. 어떻게 선언하거나 초기화합니까?

var sample = new Array();
sample[] = new Object();

위의 코드를 시도했지만 작동하지 않습니다. 인덱스 번호를 사용하지 않고 객체 배열을 어떻게 초기화합니까?



답변

array.push()배열 끝에 항목을 추가하는 데 사용 합니다.

var sample = new Array();
sample.push(new Object());

n시간 을 수행하려면 for루프를 사용하십시오 .

var n = 100;
var sample = new Array();
for (var i = 0; i < n; i++)
    sample.push(new Object());

당신은 또한 대체 할 수 있습니다 new Array()[]new Object(){}가가되도록 :

var n = 100;
var sample = [];
for (var i = 0; i < n; i++)
    sample.push({});


답변

선언의 의미에 따라 배열 리터럴 에서 객체 리터럴 을 사용해 볼 수 있습니다 .

var sample = [{}, {}, {} /*, ... */];

편집 : 목표가 undefined항목이 기본적으로 빈 개체 리터럴 인 배열 인 경우 작은 유틸리티 함수를 작성할 수 있습니다.

function getDefaultObjectAt(array, index)
{
    return array[index] = array[index] || {};
}

그런 다음 다음과 같이 사용하십시오.

var sample = [];
var obj = getDefaultObjectAt(sample, 0);     // {} returned and stored at index 0.

또는:

getDefaultObjectAt(sample, 1).prop = "val";  // { prop: "val" } stored at index 1.

물론 반환 값에 대한 직접 할당 getDefaultObjectAt()은 작동하지 않으므로 다음과 같이 작성할 수 없습니다.

getDefaultObjectAt(sample, 2) = { prop: "val" };


답변

fill () 사용할 수 있습니다 .

let arr = new Array(5).fill('lol');

let arr2 = new Array(5).fill({ test: 'a' });
// or if you want different objects
let arr3 = new Array(5).fill().map((_, i) => ({ id: i }));

5 개 항목의 배열을 생성합니다. 예를 들어 forEach를 사용할 수 있습니다.

arr.forEach(str => console.log(str));

할 때 new Array(5)길이가 5 인 객체 일 뿐이고 배열은 비어 있습니다. 당신이 사용할 때 당신은 fill()당신이 원하는 무엇이든 각 개별 지점을 채 웁니다.


답변

댓글에서 어떻게 응답했는지 확인한 후. push다른 사람들이 제안한대로 사용하는 것이 가장 좋을 것 같습니다 . 이렇게하면 인덱스를 알 필요가 없지만 배열에 추가 할 수 있습니다.

var arr = [];
function funcInJsFile() {
    // Do Stuff
    var obj = {x: 54, y: 10};
    arr.push(obj);
}

이 경우 해당 함수를 사용할 때마다 새 개체를 배열로 푸시합니다.


답변

공백을 만들 필요가 없습니다 Object. 그들과 함께 아무것도 할 수 없습니다. 필요에 따라 샘플에 작업 개체를 추가하기 만하면됩니다. 사용 push다니엘 Imms으로 제안하고, 프레데릭 Hamidi로 사용 리터럴은 제안했다. C와 같은 Javascript를 프로그래밍하려는 것 같습니다.

var samples = []; /* If you have no data to put in yet. */
/* Later, probably in a callback method with computed data */
/* replacing the constants. */
samples.push(new Sample(1, 2, 3)); /* Assuming Sample is an object. */
/* or */
samples.push({id: 23, chemical: "NO2", ppm: 1.4}); /* Object literal. */

나는 사용하는 것을 믿는다 new Array(10) 하면 10 개의 undefined요소 가있는 배열이 생성 됩니다.


답변

다음과 같이 “객체 유형”배열을 다음과 같이 한 줄로 인스턴스화 할 수 있습니다 ( new Object () 를 객체로 바꾸면됩니다).

var elements = 1000;
var MyArray = Array.apply(null, Array(elements)).map(function () { return new Object(); });


답변

그럼 array.length트릭을 할 여부를해야합니까? 그냥 읽으면 인덱스 범위를 알 필요가 없다는 뜻입니다 ..

var arrayContainingObjects = [];
for (var i = 0; i < arrayContainingYourItems.length; i++){
    arrayContainingObjects.push {(property: arrayContainingYourItems[i])};
}

질문을 올바르게 이해하지 못했을 수도 있지만 이런 식으로 배열의 길이를 가져와 객체로 변환 할 수 있어야합니다. 다니엘은 정직하게 같은 대답을했습니다. 배열 길이를 그의 변수에 저장하면 완료됩니다.

제 생각에는 이것이 일어나지 않아야한다면 Array-length를 얻을 수 없습니다. 색인 번호를 얻지 않고 말했듯이 다음과 같이 할 수 있습니다.

var arrayContainingObjects = [];
for (;;){
    try{
        arrayContainingObjects.push {(property: arrayContainingYourItems[i])};
    }
}
catch(err){
    break;
}

위 버전의 좋지 않은 버전이지만 인덱스 범위를 “실행”할 때까지 루프가 실행됩니다.