indexOf 메서드입니다 개체에서 어레이입니다?

39 의 what& 어레이에서는 객체에는 색인입니다 가져올 수 있는 가장 좋은 방법은?

이런 시나리오를 가정해 보세요.

var hello = {
    hello: 'world',
    foo: 'bar'
};
var qaz = {
    hello: 'stevie',
    foo: 'baz'
}

var myArray = [];
myArray.push(hello,qaz);

지금 가지고 있는 싶다 '는' & # 39, stevie& 객체에는 indexOf '속성' 안녕 ',', '1' 이 들어 있는 # 39 될 것 "이라고 말했다.

39 m, t, 예쁜 뉴비 i& JavaScript 와 쉐퍼드도 don& # 39 는 간단한 방법 또는 다운로드되었는지 만약 내가 내 스스로 그렇게 할 수 있어 구축하십시오 기능을 한다.

질문에 대한 의견 (6)
해결책

저는 그 한 줄 매핑해야 기능을 사용하여 해결할 수 있습니다.

pos = myArray.map(function(e) { return e.hello; }).indexOf('stevie');
해설 (16)

아리스프로토티페스핀디네스 가 지원되는 IE 이외의 모든 브라우저에서 (비사양 면쪽). 그러나 [폴리필] [2] 제공한 건 좋아요.

var indexOfStevie = myArray.findIndex(i => i.hello === "stevie");

이 솔루션을 통해 맵은 그땅은. 하지만 넌 반복 전체에 걸쳐 어레이입니다 모든 검색. 그것은 오직 한 번 반복 최악의 경우 어떤 정지점으로 핀디네스 해당되어서는 찾았습니다.

hr /&gt <;

39 의 별로 간결한 way&lt /strike&gt There& strike&gt <;;; (devs 때 인도하심이라만일 걱정이 IE8) 하지만 here& # 39 의 공통 해결책:

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. 39 don& for.in 루프가 어레이에는 사용할 수 없다.

  2. 반드시 다시 한 번 함수를 루프 또는 분할하려면 빼냅니다 빼냅니다 you& # 39, ve 늑대굴에서 너회의 &quot needle";
  3. 비 케어플 위드 객체에는 평등

예를 들어,

var a = {obj: 0};
var b = [a];
b.indexOf({obj: 0}); // -1 not found

[2]: # 폴리필 https://developer.mozilla.org/en-us/docs/web/javascript/reference/global_objects/array/findindex

해설 (8)

이는 에서 ES2015 상당히 쉽게:

myArray.map(x => x.hello).indexOf('stevie')

또는, 아마도 뛰어난 성능의 대규모 어레이에는:

myArray.findIndex(x => x.hello === 'stevie')
해설 (3)
var idx = myArray.reduce( function( cur, val, index ){

    if( val.hello === "stevie" && cur === -1 ) {
        return index;
    }
    return cur;

}, -1 );
해설 (0)

I like Pablo& # # # 39 라고 하지만, s, t 맵 don& 어레이입니다 indexOf 및 어레이입니다 # 39 의 작동합니까 모든 브라우저. S # 39 는 네이티브 코드를 사용할 수 있지만, 밑줄 it& 경우 대체 방법이 잘 알려져 있다. 또한 당기기 하는 방법, 익명 메서드 s # 39 는 정확히 어떤 Pablo& 매핑해야 않습니다.

var idx = _.chain(myArray).pluck("hello").indexOf("Stevie").value();
해설 (5)

정보기술 (it), 또는 원형 :&lt br/&gt.

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");
해설 (2)

개요

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);
      }
    };
해설 (0)

내가 여기에 대답을 실행할 수 있는 다양한 일부 성능 테스트 누구나 할 수 있는 자체.

https://jsperf.com/find-index-of-object-in-array-by-contents

내 기준으로 초기 테스트를 구글 크롬, 다음 방법 (for 루프 내부에 설정되었습니다 프로토타입 (prototype) 은 가장 빠른:

Array.prototype.indexOfObject = function (property, value) {
    for (var i = 0, len = this.length; i < len; i++) {
        if (this[i][property] === value) return i;
    }
    return -1;
}

myArray.indexOfObject("hello", "stevie");

이 코드는 약간 수정된 버전의 네이선 Zaetta& # 39 의 그 답이 있다.

정보기술 (it) 의 성능 비교 대상이 되는 것을 봤을때 내가 모두 갖춘 가운데 (인덱스화할 500) 와 매우 끝 (인덱스화할 999) 는 1000년 객체에는 어레이입니다, 설사 내가 동일팔레트에 타겟대상 에 마지막 항목은 매우 array (즉 it 가 반복하고 있는 어레이입니다 it& 전에 모든 단일 품목 # 39 의 늑대굴에서) motor1.1end 백업하도록 그래도 가장 빠른.

이 중 가장 간결한 솔루션도 이익을 위한 마지막 줄 것을 거듭 실행, 이후 해당 반복해야 합니다.

myArray.indexOfObject("hello", "stevie");
해설 (1)

반면, 대부분의 다른 여기에 대답을 사용할 수 있습니다. 그냥 가끔 it& # 39 의 가장 가까운 이를 사용할 수 있는 간단한 함수 파선-짧은 만듭니다.

// indexOf wrapper for the list of objects
function indexOfbyKey(obj_list, key, value) {
    for (index in obj_list) {
        if (obj_list[index][key] === value) return index;
    }
    return -1;
}
// Find the string in the list (default -1)
var test1 = indexOfbyKey(object_list, 'name', 'Stevie');
var test2 = indexOfbyKey(object_list, 'last_name', 'some other name');

의존하기 주목할 수 있습니다. 이 코드는 저장할 수 있으며, 또는 아주 똑똑한 지정값이 일반 솔루션을 사용할 수 있는 다양한 곳에 한 줄 광고문 동일팔레트에 닫히지만 면쪽 건이다. 하지만 가끔 그냥 기도하라주여 it& # 39 의 하는 게 낫다. 나는 여기서 그것을했다 그것을비유하사 this&quot "; 남겨두십시오 개발자가 아닌 것으로 향후 추가 역엔지니어링 작동합니까. 특히, 이 경우 교도관님도요 고려해보십시오 &quot newbie&quot. 같은 질문.

해설 (0)

내가 받은 결과 여러 가지 방법을 통해 비해 가장 빠른 방법으로 이 문제를 해결했다. # 39 의 'a' s 루프지 it&. # 39 의 5+ 배 빠른 it& 다른 어떤 경쟁업체보다도 메서드입니다.

다음은 test& # 39 의 페이지: https://jsbench.me/9hjewv6a98

해설 (1)
array.filter(function(item, indx, arr){ return(item.hello === 'stevie'); })[0];

Mind the ' [0]'.

사용할 수 있는 것이 가장 적절한 '라구나' & # 39 의 안토니오 '으로' 답변.

간략하게 대한 사과 드립니다.

해설 (0)

단지 관심 찾을 경우 포지셔닝하십시오 @Pablo& # 39 의 오토메이티드 를 참조.

"'pos = 미라이스마프 (함수 (e) {반품하십시오 에드헬러. }) 스이네쇼프 (& # 39, stevie& # 39,), "'

그러나 요소를 찾기 위한 하는 경우 (즉, 어떤 생각을 하고 있었을 경우 이 같은 일이 'myArray [pos]') , 방법을 사용하여 보다 효율적인 방법이 한 그것을하지 '필터'.

"'요소 = 미라이트필터 ((e) = &gt. # 39, & # 39, stevie& 에드헬러 =) [0], "'

지켜보리니 성능 결과를 (~ + 42% ops / sec): http://jsbench.github.io/ # 7fa01f89a5dc5cc3bee79abfde80cdb3

해설 (0)

이거 드세요.

console.log(Object.keys({foo:"_0_", bar:"_1_"}).indexOf("bar"));

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/keys

해설 (0)

단순하다.

myArray.indexOf(myArray.filter(function(item) {
    return item.hello == "stevie"
})[0])
해설 (0)

편리한 기능을 기본적으로 () '및' 아리스프로토티페스핀디네스 넷윈을 사용할 수 있습니다.

&gt. 이 경우 핀디네스 반환됩니다 배열의 인덱스 () 의 요소를 어레이입니다 충족합니다 제공된 테스트 기능을. 그렇지 않으면 - 1 반환됨.

오페라, 사파리, Internet Explorer 에서 지원되지 않습니다 그냥 적어두십시오 확장하지만 아래 링크를 나와 폴리필 사용할 수 있습니다.

추가 정보:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex

<! - begin 스니핏: js 숨기십시오: 거짓값 콘솔: 참 - &gt.

var hello = {
  hello: 'world',
  foo: 'bar'
};
var qaz = {
  hello: 'stevie',
  foo: 'baz'
}

var myArray = [];
myArray.push(hello, qaz);

var index = myArray.findIndex(function(element, index, array) {
  if (element.hello === 'stevie') {
    return true;
  }
});
alert('stevie is at index: ' + index);

끝 - &lt 스니핏 >;!

해설 (0)

내가 예증의표적으로 아래의 코드가 &amp 일반 기능을 확인할 수 있습니다. 모든 객체에 대한 작동됨

function indexOfExt(list, item) {
    var len = list.length;

    for (var i = 0; i < len; i++) {
        var keys = Object.keys(list[i]);
        var flg = true;
        for (var j = 0; j < keys.length; j++) {
            var value = list[i][keys[j]];
            if (item[keys[j]] !== value) {
                flg = false;
            }
        }
        if (flg == true) {
            return i;
        }
    }
    return -1;
}

var items = [{ "hello": 'world', "foo": 'bar' }];
var selectedItem = { "hello": 'world', "foo": 'bar' };
alert(items.indexOf(selectedItem));
alert(indexOfExt(items, selectedItem));

첫 번째 경고마다 &amp 반환되므로 - 1 (고말은 해당되어서는 찾을 수 없음). 두 번째 경고 반환되므로 0 (고말은 해당되어서는 늑대굴에서).

해설 (0)

[언더스코엘가이스 라이브러리란] '를 사용하여 _.findIndex' (http://underscorejs.org/ # 핀디네스)

39 의 here& 예제

'_.findIndex ([{1}, {a: 2, c 10}, {a: //1}, {3}] 2gb/s c 10) '

해설 (2)

'핀디네스' 방법 로다시 ES6 사용하여 라이브러리, 또는 기타 없이 쓸 수 있습니다.

function deepIndexOf(arr, obj) {
  return arr.findIndex(function (cur) {
    return Object.keys(obj).every(function (key) {
      return obj[key] === cur[key];
    });
  });
}

이렇게 하면 바로 비교하십시오 객체의 속성 (단, 재귀 꽂으십시오 이다.

39 는 '아직' 핀디네스 doesn& 구축상의 경우, t (가장 don& # 39, t) 이 검색 敲阀汽俊 汲摹窍妨绰 폴리필 표시등으로 추가할 수 있습니다.

function deepIndexOf(arr, obj) {
  function findIndex = Array.prototype.findIndex || function (pred) {
    for (let i = 0; i < this.length; ++i) {
      if (pred.call(this, this[i], i)) {
        return i;
      }
    }

    return -1;
  }

  return findIndex.call(arr, function (cur) {
    return Object.keys(obj).every(function (key) {
      return obj[key] === cur[key];
    });
  });
}

(from my 오토메이티드 켜짐이 [이 중복 제거] (https://stackoverflow.com/a/35207185/129032))

해설 (0)

[@Monika 가르크 오토메이티드] 의 푸르소 (https://stackoverflow.com/questions/8668174/indexof-method-in-an-object-array # 21544736) ['핀디네스 ()'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex) 사용할 수 있습니다 (좁히어 는 [폴리필] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex # 폴리필) 를 언스베르트 브라우저).

내가 본 다운보테드 사람들이 이 질문에 대한 잘못된 문법, 그들은 이런게야 슬픔으로창백해지고 바란다, 그리고 제 생각이지만, 이 때문에 가장 세련된 것입니다.

&gt. 이 경우 핀디네스 반환됩니다 배열의 인덱스 () 의 요소를 어레이입니다 충족합니다 제공된 테스트 기능을. 그렇지 않으면 - 1 반환됨.

예를 들면 다음과 같습니다.

<! - begin 스니핏: js 숨기십시오: &gt 거짓값 -;

var hello = {
  hello: 'world',
  foo: 'bar'
};
var qaz = {
  hello: 'stevie',
  foo: 'baz'
}

var myArray = [];
myArray.push(hello,qaz);

var index = myArray.findIndex(function(element) {
  return element.hello == 'stevie';
});

alert(index);

끝 - &lt 스니핏 >;!

해설 (2)

같은 경우 물체의 객체인지 수준들과 어레이이며 내에서 사용할 수 있어야 합니다 색인입니다 내려받습니다 객체에는 할 때와 같은 방법으로 마치 문자열으로.

var hello = {
    hello: 'world',
    foo: 'bar'
};
var qaz = {
    hello: 'stevie',
    foo: 'baz'
}

var qazCLONE = { // new object instance and same structure
    hello: 'stevie',
    foo: 'baz'
}

var myArray = [hello,qaz];

myArray.indexOf(qaz) // should return 1
myArray.indexOf(qazCLONE) // should return -1
해설 (0)