[javascript] JavaScript에서 속성별로 객체 색인을 얻는 방법은 무엇입니까?

예를 들어, 나는 :

var Data = [
  { id_list: 1, name: 'Nick', token: '312312' },
  { id_list: 2, name: 'John', token: '123123' },
]

그런 다음 예를 들어이 객체 를 정렬 / 역전 하고 싶습니다 name. 그리고 다음과 같은 것을 얻고 싶습니다 :

var Data = [
  { id_list: 2, name: 'John', token: '123123' },
  { id_list: 1, name: 'Nick', token: '312312' },
]

그리고 name='John'속성 토큰의 값을 얻기 위해 속성이있는 객체의 색인을 알고 싶습니다 .

문제를 어떻게 해결합니까?



답변

다른 답변에서 알 수 있듯이 배열을 반복하는 것이 가장 좋은 방법 일 것입니다. 그러나 나는 그것을 자체 기능에 넣고 조금 더 추상적으로 만들 것입니다.

function findWithAttr(array, attr, value) {
    for(var i = 0; i < array.length; i += 1) {
        if(array[i][attr] === value) {
            return i;
        }
    }
    return -1;
}

var Data = [
    {id_list: 2, name: 'John', token: '123123'},
    {id_list: 1, name: 'Nick', token: '312312'}
];

이를 통해 ‘John’이 포함 된 것을 찾을 수있을뿐만 아니라 ‘312312’토큰이 포함 된 것을 찾을 수 있습니다.

findWithAttr(Data, 'name', 'John'); // returns 0
findWithAttr(Data, 'token', '312312'); // returns 1
findWithAttr(Data, 'id_list', '10'); // returns -1

편집 :
찾을 수 없을 때 -1을 반환하도록 함수가 업데이트되었으므로 Array.prototype.indexOf () 와 동일한 구문을 따릅니다.


답변

정렬 부분이 이미 답변되었으므로. 배열에서 속성의 indexOf를 얻는 또 다른 우아한 방법을 제안하려고합니다.

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

var Data = [
    {id_list:1, name:'Nick',token:'312312'},
    {id_list:2,name:'John',token:'123123'}
]

넌 할 수있어:

var index = Data.map(function(e) { return e.name; }).indexOf('Nick');

Array.prototype.mapIE7 또는 IE8에서는 사용할 수 없습니다. ES5 호환성

그리고 여기 ES6와 화살표 구문이 있습니다.

const index = Data.map(e => e.name).indexOf('Nick');


답변

ES6을 사용해도 괜찮다면. 배열에는 이제 findIndex 함수가 있습니다. 이것은 다음과 같은 것을 할 수 있음을 의미합니다.

const index = Data.findIndex(item => item.name === 'John');


답변

var index = Data.findIndex(item => item.name == "John")

다음은 단순화 된 버전입니다.

var index = Data.findIndex(function(item){ return item.name == "John"})

에서 mozilla.org :

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


답변

IE에 문제가있는 경우 9.0 이상에서 지원되는 map () 함수를 사용할 수 있습니다.

var index = Data.map(item => item.name).indexOf("Nick");


답변

나에게 알려진 유일한 방법은 모든 배열을 반복하는 것입니다.

var index=-1;
for(var i=0;i<Data.length;i++)
  if(Data[i].name==="John"){index=i;break;}

또는 대소 문자를 구분하지 않습니다 :

var index=-1;
for(var i=0;i<Data.length;i++)
  if(Data[i].name.toLowerCase()==="john"){index=i;break;}

결과 변수 인덱스 에 오브젝트의 인덱스가 있거나 찾지 못한 경우 -1이 포함됩니다.


답변

프로토 타입 방식

(function(){
  if (!Array.prototype.indexOfPropertyValue){
    Array.prototype.indexOfPropertyValue = function(prop,value){
      for (var index = 0; index < this.length; index++){
        if (this[index][prop]){
          if (this[index][prop] == value){
            return index;
          }
        }
      }
      return -1;
    }
  }
 })();
 // usage:
 var Data = [
 {id_list:1, name:'Nick',token:'312312'},{id_list:2,name:'John',token:'123123'}];
 Data.indexOfPropertyValue('name','John'); // returns 1 (index of array);
 Data.indexOfPropertyValue('name','Invalid name') // returns -1 (no result);
 var indexOfArray = Data.indexOfPropertyValue('name','John');
 Data[indexOfArray] // returns desired object.