객체를 포함하는 배열을 반복하고 속성에 액세스하는 방법


188

배열에 포함 된 객체를 순환하고 각 객체의 속성을 변경하고 싶습니다. 내가 이렇게하면 :

for (var j = 0; j < myArray.length; j++){

console.log(myArray[j]);

}

콘솔은 배열의 모든 객체를 가져와야합니다. 그러나 실제로 첫 번째 개체 만 표시합니다. 루프 외부에서 배열을 콘솔 로그하면 모든 객체가 나타나므로 분명히 더 많이 있습니다.

어쨌든 다음 문제가 있습니다. 루프를 사용하여 배열의 Object1.x와 같이 어떻게 액세스합니까?

for (var j = 0; j < myArray.length; j++){

console.log(myArray[j.x]);

}

"정의되지 않음"을 반환합니다. 루프 외부의 콘솔 로그는 객체에 모두 "x"값이 있음을 알려줍니다. 루프에서 이러한 속성에 어떻게 액세스합니까?

다른 곳에서 각 속성에 대해 별도의 배열을 사용하는 것이 좋지만 먼저이 길을 다 써야합니다.

감사합니다!


2
배열 샘플을 게시 할 수 있습니까? 첫 번째 코드 스 니펫이 올바른 것 같습니다.
Sirko

j숫자입니다. 루프 맨 위에 정의했습니다.

2
어쩌면 myArray실제로는 단지 배열이 아닙니다.
techfoobar

myArray 구성 방법에 대한 자세한 정보가 필요합니다
bgusach

다음의 모든 답변과 허용되는 답변을 통해 아무도 문제가 발생하는 이유와 for 루프로 문제를 해결하는 방법을 설명하지 못합니다. #forEach공장. 그러나 문제는 for 루프에 관한 것입니다.
FreeLightman

답변:


341

내장 배열 함수에 forEach를 사용하십시오. Array.forEach():

yourArray.forEach(function (arrayItem) {
    var x = arrayItem.prop1 + 2;
    console.log(x);
});

2
기꺼이 도와드립니다 .. 자바 스크립트가 꽤 시원해지고 있습니다. 또한 forEach는 훨씬 더 복잡하고 복잡한 루프를 읽기 쉽습니다 ..
Dory Zidon

3
내가 두려워 forEachIE 9 마십시오에서 지원되지 않습니다 저를 비난하지! 내 고용주의 제품이이를 지원합니다!
fatCop

1
@DoryZidon는 : 대해 forEach는 휴식이나 정지를 지원하지 - developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
Ankur Loriya

2
실제로 배열이 있어야합니다. 당신이 가지고있는 경우 yourArray어떤에서 같은 document.getElementsByClassName그는 HTMLCollection 아닌 배열 될 것이다. 그러면 이 질문 이 도움 될 수 있습니다.
J0ANMM

참고 : forEach차단 await중이며 지원하지 않습니다 for...of.
PotatoFarmer

107

JavaScript에서 함수형 프로그래밍 방식으로 배열을 반복하는 일부 사용 사례 :

1. 그냥 배열을 반복

const myArray = [{x:100}, {x:200}, {x:300}];

myArray.forEach((element, index, array) => {
    console.log(element.x); // 100, 200, 300
    console.log(index); // 0, 1, 2
    console.log(array); // same myArray object 3 times
});

참고 : Array.prototype.forEach ()는 입력 매개 변수로받는 함수가 값을 리턴하지 않으므로 순수한 함수로 간주 될 수 없으므로 엄밀히 말하면 기능적인 방식은 아닙니다.

2. 배열의 요소 중 하나라도 테스트를 통과했는지 확인

const people = [
    {name: 'John', age: 23}, 
    {name: 'Andrew', age: 3}, 
    {name: 'Peter', age: 8}, 
    {name: 'Hanna', age: 14}, 
    {name: 'Adam', age: 37}];

const anyAdult = people.some(person => person.age >= 18);
console.log(anyAdult); // true

3. 새로운 배열로 변환

const myArray = [{x:100}, {x:200}, {x:300}];

const newArray= myArray.map(element => element.x);
console.log(newArray); // [100, 200, 300]

참고 : map () 메서드는 호출 배열의 모든 요소에서 제공된 함수를 호출 한 결과로 새 배열을 만듭니다.

4. 특정 재산을 요약하고 평균을 계산

const myArray = [{x:100}, {x:200}, {x:300}];

const sum = myArray.map(element => element.x).reduce((a, b) => a + b, 0);
console.log(sum); // 600 = 0 + 100 + 200 + 300

const average = sum / myArray.length;
console.log(average); // 200

5. 원본을 기반으로하지만 수정하지 않고 새 어레이를 만듭니다.

const myArray = [{x:100}, {x:200}, {x:300}];

const newArray= myArray.map(element => {
    return {
        ...element,
        x: element.x * 2
    };
});

console.log(myArray); // [100, 200, 300]
console.log(newArray); // [200, 400, 600]

6. 각 카테고리의 수를 센다

const people = [
    {name: 'John', group: 'A'}, 
    {name: 'Andrew', group: 'C'}, 
    {name: 'Peter', group: 'A'}, 
    {name: 'James', group: 'B'}, 
    {name: 'Hanna', group: 'A'}, 
    {name: 'Adam', group: 'B'}];

const groupInfo = people.reduce((groups, person) => {
    const {A = 0, B = 0, C = 0} = groups;
    if (person.group === 'A') {
        return {...groups, A: A + 1};
    } else if (person.group === 'B') {
        return {...groups, B: B + 1};
    } else {
        return {...groups, C: C + 1};
    }
}, {});

console.log(groupInfo); // {A: 3, C: 1, B: 2}

7. 특정 기준에 따라 어레이의 서브 세트 검색

const myArray = [{x:100}, {x:200}, {x:300}];

const newArray = myArray.filter(element => element.x > 250);
console.log(newArray); // [{x:300}] 

참고 : filter () 메서드는 제공된 함수로 구현 된 테스트를 통과하는 모든 요소를 ​​사용하여 새 배열을 만듭니다.

8. 배열 정렬

const people = [
  { name: "John", age: 21 },
  { name: "Peter", age: 31 },
  { name: "Andrew", age: 29 },
  { name: "Thomas", age: 25 }
];

let sortByAge = people.sort(function (p1, p2) {
  return p1.age - p2.age;
});

console.log(sortByAge);

여기에 이미지 설명을 입력하십시오

9. 배열에서 요소 찾기

const people = [ {name: "john", age:23},
                {name: "john", age:43},
                {name: "jim", age:101},
                {name: "bob", age:67} ];

const john = people.find(person => person.name === 'john');
console.log(john);

여기에 이미지 설명을 입력하십시오

Array.prototype.find () 메서드는 제공된 테스트 함수를 만족하는 배열의 첫 번째 요소 값을 반환합니다.

참고 문헌


1
이것은 환상적인 참고 자료입니다-이 질문에 대한 독창적입니까? 아니면 다른 곳에서 호스팅 된 것과 같은 것이 있습니까?
Salvatore

잘 설명하고 철저한 답변을 해주셔서 감사합니다.
Erica Summers

안녕하세요, 모든 이름을 표시하고 비교를하고 싶다면 어떻게하는지 알고 있습니까?
dipgirl

@ dipgirl, 아래와 같은 것입니까? const people = [ {name: "john", age:23}, {name: "john", age:43}, {name: "jim", age:101}, {name: "bob", age:67} ]; const sortByAge = people.map(p => { console.log(p.name) return p }).sort(function (p1, p2) { return p1.age - p2.age; }); console.log(sortByAge);
Yuci

1
100 번째 투표를 축하합니다 :)
Syed

46

for..of 루프 를 사용하여 객체 배열을 반복 할 수 있습니다 .

for (let item of items) {
    console.log(item); // Will display contents of the object inside the array
}

for..of루프 의 가장 좋은 점 중 하나는 단순한 배열 이상의 것을 반복 할 수 있다는 것입니다. 맵과 객체를 포함하여 모든 반복 가능한 유형을 반복 할 수 있습니다. 구형 브라우저를 지원해야하는 경우 트랜스 파일러 또는 TypeScript와 같은 것을 사용해야합니다.

맵을 반복하려면 구문이 키와 값을 모두 처리한다는 점을 제외하면 위와 거의 동일합니다.

for (const [key, value] of items) {
  console.log(value);
}

for..ofJavascript에서 수행하는 거의 모든 종류의 반복에 루프를 사용 합니다. 또한 가장 멋진 것 중 하나는 비동기 / 대기 상태에서도 작동한다는 것입니다.


29
for (var j = 0; j < myArray.length; j++){
  console.log(myArray[j].x);
}

그러나 그것은 두 번째 질문에 대한 해결책 일뿐입니다.
Sirko

18

방법은 다음과 같습니다. :)

var students = [{
    name: "Mike",
    track: "track-a",
    achievements: 23,
    points: 400,
  },
  {
    name: "james",
    track: "track-a",
    achievements: 2,
    points: 21,
  },
]

students.forEach(myFunction);

function myFunction(item, index) {
  for (var key in item) {
    console.log(item[key])
  }
}


track각 요소 의 속성 값을 가져 와서 코드의 다른 부분에서 사용하거나 보간하기 위해 변수에 할당하는 방법은 무엇입니까?
Chris22

7

객체 배열을 반복하는 것은 매우 기본적인 기능입니다. 이것이 저에게 효과적입니다.

var person = [];
person[0] = {
  firstName: "John",
  lastName: "Doe",
  age: 60
};

var i, item;

for (i = 0; i < person.length; i++) {
  for (item in person[i]) {
    document.write(item + ": " + person[i][item] + "<br>");
  }
}


6

myArray[j.x] 논리적으로 잘못되었습니다.

사용 (myArray[j].x);하는 대신

for (var j = 0; j < myArray.length; j++){
  console.log(myArray[j].x);
}

@ Cyborgx37 Oh .. jx가 잘못된 변수 이름으로 취급된다는 의미입니다.
Vivek Sadh

5

ES5 +부터 forEach 방법을 사용하는 것은 정말 간단합니다. 배열에서 각 객체의 각 속성을 직접 변경할 수 있습니다.

myArray.forEach(function (arrayElem){ 
  arrayElem = newPropertyValue;
});

각 객체의 특정 속성에 액세스하려는 경우 :

myArray.forEach(function (arrayElem){ 
      arrayElem.nameOfYourProperty = newPropertyValue;
    });

4

다음은 객체 배열을 반복하는 또 다른 방법입니다 (문서에 jQuery 라이브러리를 포함해야 함).

$.each(array, function(element) {
  // do some operations with each element... 
});

1
귀하의 답변에 $.each메소드 를 사용하기 위해 jQuery 라이브러리를로드해야한다는 중요한 정보가 누락되었습니다 .
Matthew Morek

4

이 작동합니다. 철저한 배열 반복 (yourArray). 그런 다음 각 객체 (eachObj)의 직접 속성을 반복합니다.

yourArray.forEach( function (eachObj){
    for (var key in eachObj) {
        if (eachObj.hasOwnProperty(key)){
           console.log(key,eachObj[key]);
        }
    }
});

2

jQuery를 사용한 배열 객체 반복 (문자열을 인쇄하려면 두 번째 매개 변수 사용)

$.each(array, function(index, item) {
       console.log(index, item);
});

2

var c = {
    myProperty: [
        { name: 'this' },
        { name: 'can' },
        { name: 'get' },
        { name: 'crazy' }
    ]
};

c.myProperty.forEach(function(myProperty_element) {
    var x = myProperty_element.name;
    console.log('the name of the member is : ' + x);
})

이것이 내가 그것을 달성 할 수 있었던 방법 중 하나입니다.


1

허용되는 답변은 정상적인 기능을 사용합니다. forEach에서 화살표 기능을 사용하여 약간의 수정으로 동일한 코드를 게시하십시오.

  yourArray.forEach(arrayItem => {
      var x = arrayItem.prop1 + 2;
      console.log(x);
  });

또한 $ .each에서 아래와 같이 화살표 기능을 사용할 수 있습니다

 $.each(array, (item, index) => {
       console.log(index, item);
 });

1

const jobs = [
    {
        name: "sipher",
        family: "sipherplus",
        job: "Devops"
    },
    {
        name: "john",
        family: "Doe",
        job: "Devops"
    },
    {
        name: "jim",
        family: "smith",
        job: "Devops"
    }
];

const txt = 
   ` <ul>
        ${jobs.map(job => `<li>${job.name} ${job.family} -> ${job.job}</li>`).join('')}
    </ul>`
;

document.body.innerHTML = txt;

등 진드기에주의하십시오 (`)


0

이것은 누군가를 도울 수 있습니다. 아마도 노드의 버그 일 것입니다.

var arr = [ { name: 'a' }, { name: 'b' }, { name: 'c' } ];
var c = 0;

작동하지 않습니다.

while (arr[c].name) { c++; } // TypeError: Cannot read property 'name' of undefined

그러나 이것은 작동합니다 ...

while (arr[c]) { c++; } // Inside the loop arr[c].name works as expected.

이것도 작동합니다 ...

while ((arr[c]) && (arr[c].name)) { c++; }

그러나 단순히 주문을 취소하는 것은 효과가 없습니다. Node를 손상시키는 일종의 내부 최적화가 있다고 생각합니다.

while ((arr[c].name) && (arr[c])) { c++; }

오류는 배열이 정의되어 있지 않지만 :-/ Node v11.15.0이 아니라고 말합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.