[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

몇 가지 참고 사항 :

  1. 배열에서 for … in 루프를 사용하지 마십시오
  2. “바늘”을 찾은 후에는 루프에서 벗어나거나 기능에서 복귀하십시오.
  3. 객체 평등에주의

예를 들어

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