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"})
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.
사용자 지정 함수를 매개 변수로 사용하여 Array.sort를 사용하여 정렬 메커니즘을 정의 할 수 있습니다.
귀하의 예에서 다음을 제공합니다.
var Data = [
{id_list:1, name:'Nick',token:'312312'},{id_list:2,name:'John',token:'123123'}
]
Data.sort(function(a, b){
return a.name < b.name ? -1 : a.name > b.name ? 1 : 0;
});
alert("First name is : " + Data[0].name); // alerts 'John'
alert("Second name is : " + Data[1].name); // alerts 'Nick'
정렬 함수는 a가 b 앞에 오면 -1을, a가 b 뒤에 오면 1을, 둘 다 같으면 0을 리턴해야합니다. 정렬 기능에서 올바른 논리를 정의하여 배열을 정렬하는 것은 사용자의 책임입니다.
편집 : 색인을 알고 싶은 질문의 마지막 부분을 놓쳤습니다. 다른 사람들이 말했듯이 배열을 반복해야합니다.
배열을 살펴보고 위치를 찾으십시오.
var i = 0;
for(var item in Data) {
if(Data[item].name == 'John')
break;
i++;
}
alert(i);
이것은 유용 할 수 있습니다
function showProps(obj, objName) {
var result = "";
for (var i in obj)
result += objName + "." + i + " = " + obj[i] + "\n";
return result;
}
https://developer.mozilla.org/en/JavaScript/Guide/Working_with_Objects 에서 복사했습니다.
작은 해결 방법을 사용하지 않는 이유는 무엇입니까?
Create a new array with names as indexes. after that all searches will use indexes. So, only one loop. After that you don't need to loop through all elements!
var Data = [
{id_list:1, name:'Nick',token:'312312'},{id_list:2,name:'John',token:'123123'}
]
var searchArr = []
Data.forEach(function(one){
searchArr[one.name]=one;
})
console.log(searchArr['Nick'])
http://jsbin.com/xibala/1/edit
live example.
Extended Chris Pickett's answer because in my case I needed to search deeper than one attribute level:
function findWithAttr(array, attr, value) {
if (attr.indexOf('.') >= 0) {
var split = attr.split('.');
var attr1 = split[0];
var attr2 = split[1];
for(var i = 0; i < array.length; i += 1) {
if(array[i][attr1][attr2] === value) {
return i;
}
}
} else {
for(var i = 0; i < array.length; i += 1) {
if(array[i][attr] === value) {
return i;
}
}
};
};
You can pass 'attr1.attr2' into the function
What about this ? :
Data.indexOf(_.find(Data, function(element) {
return element.name === 'John';
}));
Assuming you are using lodash or underscorejs.
var fields = {
teste:
{
Acess:
{
Edit: true,
View: false
}
},
teste1:
{
Acess:
{
Edit: false,
View: false
}
}
};
console.log(find(fields,'teste'));
function find(fields,field){
for(key in fields){
if(key == field){
return true;
}
}
return false;
}
If you have one Object with multiply objects inside, if you want know if some object are include on Master object, just put find(MasterObject,'Object to Search'), this function will return the response if exist or not (TRUE or FALSE), I hope help with this, can see the exemple on JSFiddle.
let indexOf = -1;
let theProperty = "value"
let searchFor = "something";
theArray.every(function (element, index) {
if (element[theProperty] === searchFor) {
indexOf = index;
return false;
}
return true;
});
German Attanasio Ruiz의 답변 대신 Array.map () 대신 Array.reduce ()를 사용하여 두 번째 루프를 제거 할 수 있습니다.
var Data = [
{ name: 'hypno7oad' }
]
var indexOfTarget = Data.reduce(function (indexOfTarget, element, currentIndex) {
return (element.name === 'hypno7oad') ? currentIndex : indexOfTarget;
}, -1);
collection.findIndex(item => item.value === 'smth') !== -1
참고 URL : https://stackoverflow.com/questions/7176908/how-to-get-index-of-object-by-its-property-in-javascript
'Programming' 카테고리의 다른 글
| 전체 ASP.NET 웹 사이트에 대해 브라우저 캐시를 사용하지 않도록 설정 (0) | 2020.05.08 |
|---|---|
| Android Studio에서 갑자기 기호를 확인할 수 없습니다 (0) | 2020.05.08 |
| 주어진 날짜와 오늘 비교 (0) | 2020.05.08 |
| Ajax 쿼리 게시 오류를 어떻게 포착합니까? (0) | 2020.05.08 |
| 비 www에서 www로 아파치 리디렉션 (0) | 2020.05.08 |