[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.map
IE7 또는 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"})
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.