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


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.