JavaScript 객체 배열에서 id로 객체 찾기 수 없습니다.

배열이 있습니다.

myArray = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'}, etc.]

배열의 구조를 변경할 수 없습니다. id가 전달되고 배열에서 해당 객체 45를 얻고 싶습니다 'bar'.

JavaScript 또는 jQuery를 사용하여이 작업을 어떻게 수행합니까?



답변

find()방법을 사용하십시오 :

myArray.find(x => x.id === '45').foo;

에서 MDN :

find()있어서, 상기 어레이의 제 1 값을 반환 배열에 만족하는 요소가 제공하는 기능을 테스트하는 경우. 그렇지 않으면 undefined반환됩니다.


대신 인덱스 를 찾으려면 다음을 사용하십시오 findIndex().

myArray.findIndex(x => x.id === '45');

에서 MDN :

findIndex()메소드는 제공된 테스트 기능을 만족하는 배열에서 첫 번째 요소의 색인을 리턴합니다. 그렇지 않으면 -1이 반환됩니다.


일치하는 요소의 배열을 얻으려면 filter()대신 메소드를 사용하십시오 .

myArray.filter(x => x.id === '45');

이것은 객체의 배열을 반환합니다. foo속성 배열을 얻으려면 다음 map()방법 으로이 작업을 수행 할 수 있습니다 .

myArray.filter(x => x.id === '45').map(x => x.foo);

참고 사항 : find()또는 filter()과 같은 메소드 및 화살표 기능 은 IE와 같은 구형 브라우저에서 지원되지 않으므로 이러한 브라우저를 지원하려면 Babel ( polyfill 포함 )을 사용하여 코드를 변환해야합니다 .


답변

이미 jQuery를 사용하고 있으므로 배열을 검색하기위한 grep 함수를 사용할 수 있습니다 .

var result = $.grep(myArray, function(e){ return e.id == id; });

결과는 찾은 항목이있는 배열입니다. 객체가 항상 존재하고 한 번만 발생한다는 것을 알고 있으면 result[0].foo값을 얻는 데 사용할 수 있습니다 . 그렇지 않으면 결과 배열의 길이를 확인해야합니다. 예:

if (result.length === 0) {
  // no result found
} else if (result.length === 1) {
  // property found, access the foo property using result[0].foo
} else {
  // multiple items found
}

답변

또 다른 해결책은 조회 오브젝트를 작성하는 것입니다.

var lookup = {};
for (var i = 0, len = array.length; i < len; i++) {
    lookup[array[i].id] = array[i];
}

... now you can use lookup[id]...

많은 조회를 수행해야하는 경우 특히 흥미 롭습니다.

ID와 객체가 공유되므로 더 많은 메모리가 필요하지 않습니다.


답변

ECMAScript 2015 는 배열 에서 find () 메소드를 제공합니다.

var myArray = [
 {id:1, name:"bob"},
 {id:2, name:"dan"},
 {id:3, name:"barb"},
]

// grab the Array item which matchs the id "2"
var item = myArray.find(item => item.id === 2);

// print
console.log(item.name);

외부 라이브러리없이 작동합니다. 그러나 이전 브라우저 지원 을 원할 경우이 polyfill 을 포함시킬 수 있습니다 .


답변

Underscore.js 에는 다음과 같은 좋은 방법이 있습니다.

myArray = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'},etc.]
obj = _.find(myArray, function(obj) { return obj.id == '45' })

답변

가장 쉬운 방법은 다음과 같지만 Internet Explorer 8 (또는 그 이전 버전)에서는 작동하지 않습니다.

var result = myArray.filter(function(v) {
    return v.id === '45'; // Filter out the appropriate one
})[0].foo; // Get result and access the foo property

답변

다음을 시도하십시오

function findById(source, id) {
  for (var i = 0; i < source.length; i++) {
    if (source[i].id === id) {
      return source[i];
    }
  }
  throw "Couldn't find object with id: " + id;
}