Hur man hittar index på ett objekt efter nyckel och värde i en JavaScript-array
Givet:
var peoples = [
{ "attr1": "bob", "attr2": "pizza" },
{ "attr1": "john", "attr2": "sushi" },
{ "attr1": "larry", "attr2": "hummus" }
];
Efterlyst:
Index av objekt där attr === value, till exempel attr1 === "john" eller attr2 === "hummus"
Uppdatering: Snälla, läs min fråga noggrant, jag vill inte hitta objektet via $.inArray och jag vill inte heller få värdet på ett specifikt objektattribut. Vänligen ta hänsyn till detta i era svar. Tack!
Svar #1
Den funktionella metoden
Alla de coola barnen håller på med funktionell programmering (hej React-användare) nuförtiden, så jag tänkte att jag skulle ge den funktionella lösningen. Enligt min åsikt är det faktiskt mycket trevligare än de imperativa for- och each-looparna som har föreslagits hittills, och med ES6-syntax är det ganska elegant.
Uppdatera
Det finns nu ett fantastiskt sätt att göra detta som kallas findIndex vilket tar en funktion som returnerar true/false beroende på om array-elementet matchar (som alltid, kontrollera dock webbläsarkompatibilitet).
var index = peoples.findIndex(function(person) {
return person.attr1 == "john"
});
Med ES6-syntax får du skriva detta:
var index = peoples.findIndex(p => p.attr1 == "john");
Den (Gamla) Funktionella Metoden
Sammanfattning
Om du letar efter index där peoples[index].attr1 == "john" använd:
var index = peoples.map(function(o) { return o.attr1; }).indexOf("john");
Förklaring
Steg 1
Använd .map() för att få en array med värden för en specifik nyckel:
var values = object_array.map(function(o) { return o.your_key; });
Raden ovan tar dig härifrån:
var peoples = [
{ "attr1": "bob", "attr2": "pizza" },
{ "attr1": "john", "attr2": "sushi" },
{ "attr1": "larry", "attr2": "hummus" }
];
Till här:
var values = [ "bob", "john", "larry" ];
Steg 2
Nu använder vi bara .indexOf() för att hitta indexet för nyckeln vi vill ha (vilket förstås också är indexet för objektet vi letar efter):
var index = values.indexOf(your_value);
Lösning
Vi kombinerar allt ovanstående:
var index = peoples.map(function(o) { return o.attr1; }).indexOf("john");
Eller, om du föredrar ES6-syntax:
var index = peoples.map((o) => o.attr1).indexOf("john");
Demo :
var peoples = [
{ "attr1": "bob", "attr2": "pizza" },
{ "attr1": "john", "attr2": "sushi" },
{ "attr1": "larry", "attr2": "hummus" }
];
var index = peoples.map(function(o) { return o.attr1; }).indexOf("john");
console.log("index of 'john': " + index);
var index = peoples.map((o) => o.attr1).indexOf("larry");
console.log("index of 'larry': " + index);
var index = peoples.map(function(o) { return o.attr1; }).indexOf("fred");
console.log("index of 'fred': " + index);
var index = peoples.map((o) => o.attr2).indexOf("pizza");
console.log("index of 'pizza' in 'attr2': " + index);Svar #2
Om du vill kontrollera själva objektet utan att påverka prototypen, använd hasOwnProperty():
var getIndexIfObjWithOwnAttr = function(array, attr, value) {
for(var i = 0; i < array.length; i++) {
if(array[i].hasOwnProperty(attr) && array[i][attr] === value) {
return i;
}
}
return -1;
}
för att också inkludera prototypsattribut, använd:
var getIndexIfObjWithAttr = function(array, attr, value) {
for(var i = 0; i < array.length; i++) {
if(array[i][attr] === value) {
return i;
}
}
return -1;
}
