2016-11-12 3 views
2

Ich habe ein Array der Gegenstände und ich möchte eins der Gegenstände entfernen.Javascript: Das Finden eines Index eines Gegenstandes in einem Array, den Index nicht kennend, nur das Objekt

Ich weiß nicht den Index des Objekts, das ich entfernen möchte, aber ich kenne das ganze Objekt. Das heißt:

{"field":"ingredients","gte":"bakepulver","lte":"bakepulver"} 

Ich brauche den Index des Objekts zu finden, indem sie vollen Inhalt (alle Objekte) ist, nicht nur durch field, gte oder lte. Wie finde ich den Index des Objekts im Array mit einfachem JavaScript?

+1

was unter allen einzigartig diese Objekte? – brk

+1

Kann Ihr Objekt irgendwelche Eigenschaften haben, die selbst Objekte/Arrays sind? (verschachtelt) – trincot

+2

['findIndex'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex)! – Bergi

Antwort

2

Sie könnten über die Daten iterieren und dann die Länge der Schlüssel und jedes Schlüssels überprüfen, wenn es den gleichen Inhalt hat.

var data = [{ "field": "ingredients", "gte": "egg", "lte": "egg" }, { "field": "ingredients", "gte": "bakepulver", "lte": "bakepulver" }, { "field": "ingredients", "gte": "hvetemel", "lte": "hvetemel" }], 
 
    search = { "field": "ingredients", "gte": "bakepulver", "lte": "bakepulver" }, 
 
    keys = Object.keys(search), 
 
    index = -1; 
 

 
data.some(function (a, i) { 
 
    if (Object.keys(a).length === keys.length && keys.every(function (k) { return a[k] === search[k]; })) { 
 
     index = i; 
 
     return true; 
 
    } 
 
}); 
 

 
console.log(index);

ES6

var data = [{ "field": "ingredients", "gte": "egg", "lte": "egg" }, { "field": "ingredients", "gte": "bakepulver", "lte": "bakepulver" }, { "field": "ingredients", "gte": "hvetemel", "lte": "hvetemel" }], 
 
    search = { "field": "ingredients", "gte": "bakepulver", "lte": "bakepulver" }, 
 
    keys = Object.keys(search), 
 
    index = data.findIndex(a => 
 
     Object.keys(a).length === keys.length && keys.every(k => a[k] === search[k])); 
 

 
console.log(index);

+0

Was ist der Grund für die Verwendung von 'Array.prototype.some' nur für die Iteration? (anstelle von 'Array.prototype.forEach') – zerkms

+2

wird die Iteration beendet, wenn das erste übereinstimmende Objekt gefunden wird. 'forEach 'iteriert alle Elemente des Arrays. –

+1

@NinaScholz du hast wahrscheinlich gemeint, "wahr" in das "if" zurückzukommen, wenn du willst, dass "einige" früher enden. Der aktuelle Code gibt den letzten übereinstimmenden Index zurück. – Dogbert

2

können Sie verwenden Object.keys(), Array.prototype.findIndex(), Array.prototype.every() zu überprüfen, ob jeder Eigenschaft Name, Wert und Eigenschaftsnamen Objekt .length sind gleich.

let data = [ 
 
    {"field":"ingredients","gte":"egg","lte":"egg"}, 
 
    {"field":"ingredients","gte":"bakepulver","lte":"bakepulver"}, 
 
    {"field":"ingredients","gte":"hvetemel","lte":"hvetemel"} 
 
]; 
 

 
let props = {"field":"ingredients","gte":"bakepulver","lte":"bakepulver"}; 
 
let keys = Object.keys(props); 
 
let index = data.findIndex(o => keys.every(key => o[key] === props[key]) 
 
       && Object.keys(o).length === keys.length); 
 

 
console.log(index);

0

Sie könnten diesen Code für Ihr Problem

var array = [ 
    {"field":"ingredients","gte":"egg","lte":"egg"}, 
    {"field":"ingredients","gte":"bakepulver","lte":"bakepulver"}, 
    {"field":"ingredients","gte":"hvetemel","lte":"hvetemel"} 
]; 
var searchObject =  
    {"field":"ingredients","gte":"bakepulver","lte":"bakepulver"}; 

var indexOfSearchResult; 

for (var i = 0; i < array.length; i++) { 
    var checkEqualBool = true; 
    for (var key in array[i]) { 
     if(array[i][key]!=searchObject[key]){ 
      checkEqualBool = false; 
      break; 
     } 
    } 
    if(checkEqualBool){ 
     indexOfSearchResult = i; 
     break; 
    } 
} 
0

verwenden Ich verwende alte Methode Objekt zu vergleichen, die von stringify es. versuchen Sie dieses

var x = [{ 
 
    "field": "ingredients", 
 
    "gte": "egg", 
 
    "lte": "egg" 
 
}, { 
 
    "field": "ingredients", 
 
    "gte": "bakepulver", 
 
    "lte": "bakepulver" 
 
}, { 
 
    "field": "ingredients", 
 
    "gte": "hvetemel", 
 
    "lte": "hvetemel" 
 
}]; 
 
var control = { 
 
    "field": "ingredients", 
 
    "gte": "bakepulver", 
 
    "lte": "bakepulver" 
 
}; 
 

 
function getIndex(arr, key) { 
 
    var got = false, 
 
    result = -1; 
 
    arr.every(function(e, i) { 
 
    if (JSON.stringify(e) === JSON.stringify(key)) { 
 
     console.log('match found'); 
 
     result = i; 
 
     return false; 
 
    } 
 
    return true; 
 
    }) 
 
    return result; 
 
} 
 

 
console.log(getIndex(x, control));

+0

dies funktioniert nur, wenn die Eigenschaften die gleiche Reihenfolge haben, die nicht mit Objekten garantiert ist. –

+0

ya das ist der Hauptnachteil. stimme genau mit dir überein @NinaScholz – RizkiDPrast

1

Bewertung Als ich von Ihrem weiteren Kommentare zu verstehen, müssen Sie eine Lösung für diesen speziellen Fall nur, wo die Objekte von 3 angegebenen Eigenschaften bestehen. Deshalb würde ich dieses ES6 Lösung vorschlagen:

var data = [ 
 
    { "field": "ingredients", "gte": "egg", "lte": "egg" }, 
 
    { "field": "ingredients", "gte": "bakepulver", "lte": "bakepulver" }, 
 
    { "field": "ingredients", "gte": "hvetemel", "lte": "hvetemel" }]; 
 
var search = { "field": "ingredients", "gte": "bakepulver", "lte": "bakepulver" }; 
 

 
var index = data.findIndex(
 
    a => a.field == search.field && a.gte == search.gte && a.lte == search.lte); 
 

 
console.log(index);

Wenn Sie nicht voll ES6 Unterstützung verfügen, dann:

var data = [ 
 
    { "field": "ingredients", "gte": "egg", "lte": "egg" }, 
 
    { "field": "ingredients", "gte": "bakepulver", "lte": "bakepulver" }, 
 
    { "field": "ingredients", "gte": "hvetemel", "lte": "hvetemel" }]; 
 
var search = { "field": "ingredients", "gte": "bakepulver", "lte": "bakepulver" }; 
 

 
var index = -1; 
 
data.some(function (a, i) { 
 
    if (a.field == search.field && a.gte == search.gte && a.lte == search.lte) 
 
     return index = i, true; 
 
}); 
 
console.log(index);

Verwandte Themen