2015-05-21 6 views
5

Ich muss überprüfen, ob ein Objekt logisch in einem Array ist, wenn zwei Objekte logisch gleich sind (Genau wie die equals in Java), wird es wie behandelt " in "das ArrayWie überprüft man, ob ein Objekt logisch in einem Array ist, JavaScript

Während ich $.inArray von jQuery verwenden, um unten Code zu testen, es retuans -1, anzeigend, dass der kopierte nicht als" in "das Array behandelt wird.

var a =[{value: "G27", title: "G27"}]; 
$.inArray({value: "G27", title: "G27"},a); //returns -1 

Dies ist nur ein Beispiel, Gibt es eine einfache Möglichkeit für generic Fälle zu erreichen, dass

+2

In JavaScript sind keine zwei Objekte gleich, daher wird es generell schwierig, und Sie sollten wahrscheinlich versuchen, eine bessere Methode zur Strukturierung Ihrer Daten zu finden. – adeneo

+0

Sie erstellen zwei Objekte, aber wenn Sie es so machen, wird es funktionieren: 'var b = {Wert:" G27 ", Titel:" G27 "}; var a = [b]; $ .inArray (b, a); // gibt 0 zurück 0' –

+0

Ich denke, dass Sie hier eine mögliche Antwort finden könnten: [array.contains (obj) in JavaScript] [1]! [1]: http://stackoverflow.com/questions/237104/array-containsobj-in-javascript – KevinD

Antwort

1

Eine Abhilfe für Schleife für jedes Schlüssel-Wert-Paar in einem prüfen wäre:

function exist(arr, obj){ 
    var len = Object.keys(obj).length; 
    var count = 0; 
    for(var i=0;i<arr.length;i++){ 
     count=0; 
     for(var key in obj){ 
      if(obj[key] == arr[i][key]){ 
      count++; 
      } 
     } 
     if(count == len && count == Object.keys(arr[i]).length){ 
     console.log("Exists!!"); 
     return; 
     } 
    } 
    console.log("Don't exist!!"); 
} 

var arr =[{value: "G27", title: "G27"}]; 
var b = {value: "G27", title: "G27"}; 
//Call 
exist(arr, b); 
+0

Dies ist eine nicht dynamische Lösung, weil es ein einfaches Objekt mit nur Schlüssel/Wert Attribute annimmt. Jedes Mal, wenn dem Objekt eine neue Eigenschaft hinzugefügt wird, muss er diese Schleife bearbeiten: – Gouda

+0

@ Gouda. Du hattest Recht. Bearbeitete meine Antwort. – Zee

+0

@Jaskey Versuchen Sie diese Lösung, sollte funktionieren. – Zee

0

Sie könnten die Filtermethode des Arrays verwenden.

var arr = [{value: "G27", title: "G27"}]; 
// Don't call filter on arr because this will mutate arr itself. Instead of creating a new array. 
var filteredArr = Array.prototype.filter.call(arr, function(item) { 
    return item.value == "G27" && iem.title == "G27"; 
}); 

if(filteredArr.length > 0) { 
    // Item exists 
} 
1

Wenn Sie mit Underscore.js fühlen, könnten Sie _.findWhere() Versuchen Sie es mit:

var a = [{value: "G27", title: "G27"}]; 
 
snippet.log(_.findWhere(a, {value: "G27", title: "G27"}) !== undefined); // returns true
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script> 
 
<script src="http://underscorejs.org/underscore-min.js"></script>

+0

Hallo @Scimonster, kein Problem, meine Bearbeitung abzulehnen .. wie ich sehe, hast du die Antwort noch besser gemacht, mir hat deine Antwort einfach gefallen und versucht zu beweisen, wie es funktioniert :) – Gouda

0

Sie versuchen, suchen benutzerdefinierte können:

var indexOf = function(array, obj) { 
 
    var i = array.length; 
 
    var o; 
 
    while (o = array[--i]) //note, its assignment 
 
    if (obj.value === o.value && obj.title === o.title) 
 
     break; 
 
    return i; 
 
}; 
 

 
var arr = [{ 
 
    value: "G27", 
 
    title: "G27" 
 
}, { 
 
    value: "G28", 
 
    title: "G28" 
 
}, { 
 
    value: "G29", 
 
    title: "G29" 
 
}]; 
 

 
console.log(indexOf(arr, { 
 
    title: "G28", 
 
    value: "G28" 
 
})); //<-- 1 
 

 
console.log(indexOf(arr, { 
 
    title: "G30", 
 
    value: "G30" 
 
})); //<-- -1

+0

Problem ist für Objekt definiert zB als: '{ title : "G28", Wert: "G28" } 'Oder' { Titel: "G28", Wert: "G28" } 'sind das gleiche als' { Wert: "G28", Titel: " G28 " }' –

+0

@ A.Wolff, vielen Dank für die schnelle Überprüfung. – Arvind

Verwandte Themen