[javascript] 객체 배열의 indexOf 메소드?
객체를 포함하는 배열의 인덱스를 얻는 가장 좋은 방법은 무엇입니까?
이 시나리오를 상상해보십시오.
var hello = {
hello: 'world',
foo: 'bar'
};
var qaz = {
hello: 'stevie',
foo: 'baz'
}
var myArray = [];
myArray.push(hello,qaz);
이제이 예제에서 indexOf
어떤 hello
속성이 'stevie'
어떤 객체인지 확인 하고 싶습니다 1
.
나는 JavaScript를 처음 접하는 초보자이며 간단한 방법이 있는지 또는 그렇게하기 위해 내 자신의 함수를 만들어야하는지 모르겠습니다.
답변
map 함수를 사용하여 한 줄로 해결할 수 있다고 생각합니다 .
pos = myArray.map(function(e) { return e.hello; }).indexOf('stevie');
답변
Array.prototype.findIndex 는 IE 이외의 모든 브라우저에서 지원됩니다 (에지 없음). 그러나 제공된 폴리 필 은 훌륭합니다.
var indexOfStevie = myArray.findIndex(i => i.hello === "stevie");
지도가있는 솔루션은 괜찮습니다. 그러나 모든 검색마다 전체 배열을 반복합니다. 일치하는 것이 발견되면 반복을 중지 하는 findIndex 의 최악의 경우입니다 .
간결한 방법은 없지만 (개발자가 IE8에 대해 걱정해야 할 때) 일반적인 해결책은 다음과 같습니다.
var searchTerm = "stevie",
index = -1;
for(var i = 0, len = myArray.length; i < len; i++) {
if (myArray[i].hello === searchTerm) {
index = i;
break;
}
}
또는 기능으로 :
function arrayObjectIndexOf(myArray, searchTerm, property) {
for(var i = 0, len = myArray.length; i < len; i++) {
if (myArray[i][property] === searchTerm) return i;
}
return -1;
}
arrayObjectIndexOf(arr, "stevie", "hello"); // 1
몇 가지 참고 사항 :
- 배열에서 for … in 루프를 사용하지 마십시오
- “바늘”을 찾은 후에는 루프에서 벗어나거나 기능에서 복귀하십시오.
- 객체 평등에주의
예를 들어
var a = {obj: 0};
var b = [a];
b.indexOf({obj: 0}); // -1 not found
답변
ES2015에서 이것은 매우 쉽습니다.
myArray.map(x => x.hello).indexOf('stevie')
또는 더 큰 어레이의 성능이 더 좋을 수도 있습니다.
myArray.findIndex(x => x.hello === 'stevie')
답변
var idx = myArray.reduce( function( cur, val, index ){
if( val.hello === "stevie" && cur === -1 ) {
return index;
}
return cur;
}, -1 );
답변
Pablo의 답변이 마음에 들지만 Array # indexOf 및 Array # map이 모든 브라우저에서 작동하지는 않습니다. Underscore는 사용 가능한 경우 기본 코드를 사용하지만 대체 기능도 있습니다. 또한 Pablo의 익명 맵 방법이하는 일을 정확하게 수행하기위한 퍽 방법이 있습니다.
var idx = _.chain(myArray).pluck("hello").indexOf("Stevie").value();
답변
또는 프로토 타입을 작성하십시오.
Array.prototype.indexOfObject = function arrayObjectIndexOf(property, value) {
for (var i = 0, len = this.length; i < len; i++) {
if (this[i][property] === value) return i;
}
return -1;
}
myArr.indexOfObject("name", "stevie");
답변
간결한
myArray.indexOf('stevie','hello')
사용 사례 :
/*****NORMAL****/
[2,4,5].indexOf(4) ;//OUTPUT 1
/****COMPLEX*****/
[{slm:2},{slm:4},{slm:5}].indexOf(4,'slm');//OUTPUT 1
//OR
[{slm:2},{slm:4},{slm:5}].indexOf(4,function(e,i){
return e.slm;
});//OUTPUT 1
/***MORE Complex**/
[{slm:{salat:2}},{slm:{salat:4}},{slm:{salat:5}}].indexOf(4,function(e,i){
return e.slm.salat;
});//OUTPUT 1
API :
Array.prototype.indexOfOld=Array.prototype.indexOf
Array.prototype.indexOf=function(e,fn){
if(!fn){return this.indexOfOld(e)}
else{
if(typeof fn ==='string'){var att=fn;fn=function(e){return e[att];}}
return this.map(fn).indexOfOld(e);
}
};