2017-05-09 2 views
0

Ich habe dieses Problem algoritme, möchte ich überprüfen, ob ein Objekt bereits in meinem Array vor dem Hinzufügen vorhanden ist.Wie kann überprüft werden, ob ein Objekt bereits in einem Array vorhanden ist, bevor es hinzugefügt wird?

Ich habe viele verschiedene Ansätze (indexOf, Filter ...) versucht, und mein letzter Versuch ist mit einem angular.foreach.

Das Problem ist mein $ scope.newJoin bleibt immer leer. Ich verstand, warum, es ist, weil das, wenn nie gelesen wird, wegen der 0 Größe meines $ scope.newJoin, aber ich weiß nicht, wie dies herauszufinden ...


$ scope.newJoinTMP besteht aus: 6 Objekten, in denen jeweils ein timePosted Attribut (für den Vergleich dieser verschiedenen Array-Objekte verwendet).

$ scope.newJoin ist ein leeres Array. Ich möchte es mit den Objekten innerhalb $ scope.newJoinTMP aber mit der Sicherheit zu haben einmal jedes Objekte, und nicht doppelt so viel ($ scope.newJoinTMP kann doppelte Objekte haben, aber $ scope.newJoin müssen t).

    angular.forEach($scope.newJoinTMP, function(item) 
 
        { 
 
         
 
         angular.forEach($scope.newJoin, function(item2) 
 
         { 
 
          if (item.timePosted === item2.timePosted) 
 
          { 
 
           //snap.val().splice(snap.val().pop(item)); 
 
           console.log("pop"); 
 
          } 
 
          else 
 
          { 
 
           $scope.newJoin.push(item); 
 
           console.log("newJoin :", $scope.newJoin); 
 
          } 
 
         }); 
 
        });

Antwort

0

Sie reduce

$scope.newJoin = $scope.newJoinTMP.reduce(function(c, o, i) { 
    var contains = c.some(function(obj) { 
     return obj.timePosted == o.timePosted; 
    }); 

    if (!contains) { 
     c.push(o); 
    } 

    return c; 
}, []); 

Das Problem mit dem aktuellen Code verwenden können, wenn newJoin leer ist, wird nie etwas, um es zu bekommen hat - und wenn es ist nicht leer , wenn die erste Iteration nicht mit dem aktuellen Item übereinstimmt, das von newJoinTMP iteriert wird - Sie drücken.

1
if(!$scope.newJoin.find(el=>item.timePosted===el.timePosted){  
     $scope.newJoin.push(item); 
     console.log("newJoin :", $scope.newJoin); 
} 

Sie nicht wollen, innerhalb eines forEach schieben, da es mehrmals drücken, wird ...

+0

Oooh, das ist ein Fehler, ich immer getan, danke, es zu spitz ... Wie man einen Push in einem forEach ersetzen? Mit einem einfachen Indexwert, den ich in jeder Schleife erhöhen? Wie folgt: $ scope.newJoin [i] = item? – Memphis

+0

@memphis: Schau dir meinen Code nochmal an (er enthält bereits eine Antwort;)) –

1

Es könnte bessere Möglichkeiten, Ihre besondere Situation zu handhaben, aber hier ist eine Lösung für Ihre speziellen Code. Ihre innere Ersetzte für jeden etwas mit der boolean für das Vorhandensein von Element zurückgibt und von diesem Booleschen Wert, der Entscheidung, ob Element hinzuzufügen, oder nicht

   angular.forEach($scope.newJoinTMP, function(item) 
       { 

        var isItemPresent = $scope.newJoin.some(function(item2) 
        { 
         return item.timePosted === item2.timePosted; 
         //you dont need this conditional handling for each iteration. 
         /* if (item.timePosted === item2.timePosted) 
         { 
          //snap.val().splice(snap.val().pop(item)); 
          console.log("pop"); 
         } 
         else 
         { 
          $scope.newJoin.push(item); 
          console.log("newJoin :", $scope.newJoin); 
         } */ 
        }); 
        if(! isItemPresent) { 
         $scope.newJoin.push(item); 
        } else { 
         //do if it was present. 
        } 
       }); 
1

Wenn Sie die verschachtelte Schleife (forEach, einige, indexOf vermeiden wollen oder was auch immer) Sie können ein Hilfsobjekt verwenden. Es wird mehr Speicher verbrauchen, aber Sie werden weniger Zeit verbringen.

let arr = [{ id: 0 }, { id:0 }, { id: 1}]; 
 
let aux = {}; 
 

 
const result = arr.reduce((result, el) => { 
 
    if (aux[el.id] === undefined) { 
 
    aux[el.id] = null; 
 
    return [el, ...result]; 
 
    } else { 
 
    return result; 
 
    } 
 
}, []); 
 

 
console.log(result);

Verwandte Themen