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;
}

Relaterade artiklar