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'
속성 토큰 값을 가져옵니다.
어떻게 하면 문제를 해결할 수 있을까요?
소트 부분은 이미 답변이 되어 있기 때문에.어레이에 있는 자산의 인덱스를 얻을 수 있는 다른 우아한 방법을 제안합니다.
예를 들어 다음과 같습니다.
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');
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');
console.log(index)
Array.prototype.map
는 Internet Explorer 7 또는 Internet Explorer 8에서는 사용할 수 없습니다.ES5 호환성
ES6 및 Arrow 구문은 더욱 간단합니다.
const index = Data.map(e => e.name).indexOf('Nick');
ES6를 사용해도 괜찮다면 어레이에 findIndex 기능이 있습니다.즉, 다음과 같은 작업을 수행할 수 있습니다.
const index = Data.findIndex(item => item.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.protype.indexOf()와 동일한 구성을 따릅니다.
Internet Explorer에 문제가 있는 경우 9.0 이후 지원되는 map() 함수를 사용할 수 있습니다.
var index = Data.map(item => item.name).indexOf("Nick");
var index = Data.findIndex(item => item.name == "John")
다음 내용을 간략화한 버전입니다.
var index = Data.findIndex(function(item){ return item.name == "John"})
mozilla.org 에서 :
findIndex() 메서드는 지정된 테스트 함수를 충족하는 배열 내 첫 번째 요소의 인덱스를 반환합니다.그렇지 않으면 -1이 반환됩니다.
제가 아는 유일한 방법은 모든 어레이를 루프하는 것입니다.
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 the desired object.
필터 방법을 사용할 수 있습니다.
const filteredData = data.filter(e => e.name !== 'john');
어레이를 살펴보고 위치를 찾아보세요.
var i = 0;
for(var item in Data) {
if(Data[item].name == 'John')
break;
i++;
}
alert(i);
let indexOf = -1;
let theProperty = "value"
let searchFor = "something";
theArray.every(function (element, index) {
if (element[theProperty] === searchFor) {
indexOf = index;
return false;
}
return true;
});
collection.findIndex(item => item.value === 'smth') !== -1
맞춤 함수를 매개 변수로 사용하여 Array.sort를 사용하여 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 중 하나를 반환해야 합니다.정렬 기능에서 어레이를 정렬하기 위한 올바른 논리를 정의하는 것은 사용자에게 달려 있습니다.
인덱스를 알고 싶은 질문의 마지막 부분을 놓쳤습니다.다른 사람이 말한 것처럼 어레이를 루프하여 찾아야 합니다.
이것은 도움이 될 수 있습니다.
function showProps(obj, objName) {
var result = "";
for (var i in obj)
result += objName + "." + i + " = " + obj[i] + "\n";
return result;
}
오브젝트 조작에서 복사한 것입니다.
간단한 회피책을 사용하세요.
이름을 인덱스로 사용하여 새 배열을 만듭니다.그런 다음 모든 검색에서 인덱스를 사용합니다.루프는 하나뿐입니다.그 후에는 모든 요소를 루핑할 필요가 없습니다.
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
실제 예
저는 Chris Pickett의 답변을 확장했습니다.저 같은 경우에는 속성 레벨을 두 개 이상 검색할 필요가 있었기 때문입니다.
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;
}
}
};
};
함수에 'attr1.attr2'를 입력할 수 있습니다.
사용방법:
Data.indexOf(_.find(Data, function(element) {
return element.name === 'John';
}));
Lodash 또는 Underscore.js를 사용하는 것으로 가정합니다.
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;
}
여러 하는 하나의 가 있는지 하려면 를 하십시오.find(MasterObject, 'Object to Search')
이 함수는 응답이 존재하는지 여부를 반환합니다(TRUE 또는 FALSE).JSFiddle에서 예를 볼 수 있습니다.
속성 토큰의 값을 가져오려면 다음 작업을 수행할 수도 있습니다.
let data=[
{ id_list: 1, name: 'Nick', token: '312312' },
{ id_list: 2, name: 'John', token: '123123' },
]
let resultingToken = data[_.findKey(data,['name','John'])].token
_.findKey는 Lodash 함수입니다.
Lodash 라이브러리에서 findIndex를 사용할 수 있습니다.
예를 들어:
var users = [
{ 'user': 'barney', 'active': false },
{ 'user': 'fred', 'active': false },
{ 'user': 'pebbles', 'active': true }
];
_.findIndex(users, function(o) { return o.user == 'barney'; });
// => 0
// The `_.matches` iteratee shorthand.
_.findIndex(users, { 'user': 'fred', 'active': false });
// => 1
// The `_.matchesProperty` iteratee shorthand.
_.findIndex(users, ['active', false]);
// => 0
// The `_.property` iteratee shorthand.
_.findIndex(users, 'active');
// => 2
독일어 Atanasio Ruiz의 답변 대신 Array.map() 대신 Array.reduce()를 사용하여 두 번째 루프를 제거할 수 있습니다.
var Data = [
{ name: 'hypno7oad' }
]
var indexOfTarget = Data.reduce(function (indexOfTarget, element, currentIndex) {
return (element.name === 'hypno7oad') ? currentIndex : indexOfTarget;
}, -1);
오브젝트일 수도 있어요키, Object.entries 및 Object.values 메서드가 도움이 될 수 있습니다.
Underscore.js 사용:
var index = _.indexOf(_.pluck(item , 'name'), 'Nick');
언급URL : https://stackoverflow.com/questions/7176908/how-can-i-get-the-index-of-an-object-by-its-property-in-javascript
'source' 카테고리의 다른 글
jQuery UI 정렬 가능, 데이터베이스에 순서 쓰기 (0) | 2022.12.13 |
---|---|
MySQL 저속 쿼리 로그를 활성화하려면 어떻게 해야 합니까? (0) | 2022.12.03 |
create-module-app 웹 팩 구성 및 파일은 어디에 있습니까? (0) | 2022.12.03 |
MySQL Join에서 여러 조건을 충족해야 하는 문제가 발생함 (0) | 2022.12.03 |
방금 설치된 MariaDB 10.3 데이터베이스의 상태를 확인할 때 오류 발생 (0) | 2022.12.03 |