객체 배열 선언


87

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

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

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

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

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


1
그래서 기본적으로 모든 배열 항목 객체를 만들려고합니까?
Jeff Shaver

@Jeff Yupp, 당신 말이 맞아요 ..
Prasath K

나는 그렇게하는 데있어서 요점이 보이지 않는다. 이러한 방식으로 수행하려는 이유를 이해하면 실제로 문제를 해결하는 방법을 이해하는 데 도움이 될 수 있습니다.
Jeff Shaver

1
개체에 무엇이 있습니까? array.push(objYouWant )함수 내부에서 구현 하는 것이 확실히 해결책 인 것처럼 들리기 때문에 함수가 실행될 때마다 원하는 속성을 가진 새 개체를 추가합니다.
Jeff Shaver

1
자동으로 개체가되는 것이 상황에 어떻게 도움이 될지 모르겠습니다.
Jeff Shaver

답변:


89

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({});

38

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

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

@PrasathK, 배열을 동적으로 채우는 것입니까 (예 : 루프를 통해)? 그런 다음 Daniel의 대답을 따르고 push().
Frédéric Hamidi

@PrasathK, 그 반대표는 내 것이 아닙니다. 내가 당신을 올바르게 이해한다면 질문에 대한 Jeff Shaver의 의견이 맞습니까?
Frédéric Hamidi

23

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()당신이 원하는 무엇이든 각 개별 지점을 채 웁니다.


글을 올린 직후 첫 페이지에서 보았습니다. 새로운 답변이 담긴 오래된 질문 이었기 때문에 눈에 띄었습니다.
멜 포메 네

다른 답변에 비해 사용하고 이해하기 어렵다고 생각합니다.
Sachin Shah

12

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

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

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


오 맙소사 .. 나는 그 객체에 100 개 이상의 변수를 가지고 있으며 각각의 모든 객체 또는 함수 호출에 대해 함수 시작시 일부 변수에 대한 값을 초기화해야합니다
Prasath K

11

공백을 만들 필요가 없습니다 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요소 가있는 배열이 생성 됩니다.


10

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

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

2
요소의 가치를 모르는 경우 어떻게합니까?
Prasath K

6

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

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


5

이 시도-

var arr = [];
arr.push({});

이렇게하면 하나의 요소 만 객체가됩니다 .. 모든 요소가 객체가되기를 원합니다
Prasath K

1
@ShuklaSannidhya이 게시물은 이것이 무엇을하고 왜 그것을 추천하는지에 대한 설명이 부족합니다. ... 그냥 말해요.
mickmackusa

5
//making array of book object
var books = [];
    var new_book = {id: "book1", name: "twilight", category: "Movies", price: 10};
    books.push(new_book);
    new_book = {id: "book2", name: "The_call", category: "Movies", price: 17};
    books.push(new_book);
    console.log(books[0].id);
    console.log(books[0].name);
    console.log(books[0].category);
    console.log(books[0].price);

// also we have array of albums
var albums = []    
    var new_album = {id: "album1", name: "Ahla w Ahla", category: "Music", price: 15};
    albums.push(new_album);
    new_album = {id: "album2", name: "El-leila", category: "Music", price: 29};
    albums.push(new_album);
//Now, content [0] contains all books & content[1] contains all albums
var content = [];
content.push(books);
content.push(albums);
var my_books = content[0];
var my_albums = content[1];
console.log(my_books[0].name);
console.log(my_books[1].name); 

console.log(my_albums[0].name);
console.log(my_albums[1].name); 

이 예제는 나와 함께 작동합니다. 브라우저 콘솔의 출력에 대한 스냅 샷


1

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

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

당신은 그것을 사용할 수 있습니다

var x = 100;
var sample = [];
for(let i=0; i<x ;i++){
  sample.push({}) 
  OR
  sample.push(new Object())
}    

1

forEach를 사용하여 데이터에 대해 비즈니스 로그인을 수행하려는 데이터가 이미있는 경우 데이터를 저장할 수 있습니다.

var sample = new Array();
var x = 10;
var sample = [1,2,3,4,5,6,7,8,9];
var data = [];

sample.forEach(function(item){
    data.push(item);
})

document.write(data);

간단한 for 루프를 사용한 예

var data = [];
for(var i = 0 ; i < 10 ; i++){
   data.push(i);
}
document.write(data);

1

배열 내부의 모든 요소를 ​​객체로 만들려면 JavaScript 프록시를 사용하여 객체를 배열에 삽입하기 전에 객체에 대한 유효성 검사를 적용 할 수 있습니다. 아주 간단합니다.

const arr = new Proxy(new Array(), {
  set(target, key, value) {
    if ((value !== null && typeof value === 'object') || key === 'length') {
      return Reflect.set(...arguments);
    } else {
      throw new Error('Only objects are allowed');
    }
  }
});

이제 다음과 같이하려고하면 :

arr[0] = 'Hello World'; // Error

오류가 발생합니다. 그러나 개체를 삽입하면 다음이 허용됩니다.

arr[0] = {}; // Allowed

프록시에 대한 자세한 내용은 다음 링크를 참조하십시오 : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy

polyfill 구현을 찾고 있다면 다음 링크를 확인할 수 있습니다 : https://github.com/GoogleChrome/proxy-polyfill


1

내 프로젝트의 아래 코드는 아마도 당신에게 좋을 것입니다.

  reCalculateDetailSummary(updateMode: boolean) {

    var summaryList: any = [];
    var list: any;
    if (updateMode) { list = this.state.pageParams.data.chargeDefinitionList }
    else {
        list = this.state.chargeDefinitionList;
    }

    list.forEach((item: any) => {
        if (summaryList == null || summaryList.length == 0) {
            var obj = {
                chargeClassification: item.classfication,
                totalChargeAmount: item.chargeAmount
            };
            summaryList.push(obj);

        } else {
            if (summaryList.find((x: any) => x.chargeClassification == item.classfication)) {
                summaryList.find((x: any) => x.chargeClassification == item.classfication)
                    .totalChargeAmount += item.chargeAmount;
            }
        }
    });

    if (summaryList != null && summaryList.length != 0) {
        summaryList.push({
            chargeClassification: 'Total',
            totalChargeAmount: summaryList.reduce((a: any, b: any) => a + b).totalChargeAmount
        })
    }

    this.setState({ detailSummaryList: summaryList });
}

1
const sample = [];
    list.forEach(element => {
      const item = {} as { name: string, description: string };
      item.name= element.name;
      item.description= element.description;
      sample.push(item);
    });
    return sample;

누구든지 이것을 시도하고 뭔가를 제안하십시오.


-7
var ArrayofObjects = [{}]; //An empty array of objects.

1
아니요. 그것은 하나의 객체의 비어 있지 않은 배열입니다 .
Quentin

Stack Overflow에 오신 것을 환영합니다! 이 코드 스 니펫은 질문을 해결할 수 있지만 설명을 포함하면 게시물의 품질을 향상시키는 데 큰 도움이됩니다. 미래에 독자를 위해 질문에 답하고 있으며 해당 사용자는 코드 제안 이유를 모를 수 있습니다. 또한 설명 주석으로 코드를 복잡하게 만들지 마십시오. 이렇게하면 코드와 설명의 가독성이 감소합니다!
kayess
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.