2016-10-12 4 views
0

Ich habe Probleme beim Entfernen von Elementen aus einem Array basierend auf dem übereinstimmenden Wert. Ich habe ein Array von Objekt wie folgt:Entfernen Sie mehrere Elemente aus dem Array basierend auf dem übereinstimmenden Wert

$scope.listOfItems = [ 
    {productID : 1, weight: 3.5, price: 5}, 
    {productID : 2, weight: 4.5, price: 8}, 
    {productID : 3, weight: 1.5, price: 9}, 
    {productID : 4, weight: 2.5, price: 3}, 
    {productID : 5, weight: 7.5, price: 1} 
]; 

Und ich mag, Elemente entfernen, basierend auf einer Reihe von ProduktID, wie unten:

$scope.deleteList = [1,3]; 

Jetzt versuche ich zwei Schleifen zu verwenden, um zu überprüfen, ob die productID, wenn jedes Produkt mit einer Produkt-ID in der deleteList identisch ist.

angular.forEach($scope.listOfItems , function(value, key){ 
    var tmp_productID = value.productID ; 
    var index  = key; 
    angular.forEach($scope.deleteList, function(value,key){ 
     if(tmp_productID === value){ 
      $scope.listOfItems .splice(index ,1); 
     } 
    }); 
}); 
console.log($scope.listOfItems); 

Das Problem dieses ist, nachdem er das mit index1 löscht, wird die index3 index2 sein, so wird es product2 und Produkt 5 statt product2 und product4, löschen, die nicht stimmt. Auch die Leistung wird schlecht, wenn ich eine große Anzahl von Objekten im Array habe und die Hälfte davon löschen möchte. Irgendeine Idee, dass ich die richtige Aufzeichnung löschen und die Leistung wenn möglich verbessern kann?

Arbeiten jsfiddle http://jsfiddle.net/Lvc0u55v/10726/

+0

Haben Sie Probleme haben mit einer neuen zu schaffen Array, anstatt an Ort und Stelle zu ändern? –

+0

Klicken Sie auf die '<>' und erstellen Sie eine [mcve] – mplungjan

+0

Ich möchte kein neues Array erstellen, weil mein HTML Daten bündelt mit Array listOfItems – Jaaaaaaay

Antwort

1

Sie in umgekehrter Reihenfolge durchlaufen könnte, auf diese Weise das Spleißen der vorherigen Indizes

nicht beeinflussen

var $scope = {}; 
 

 
$scope.listOfItems = [{ 
 
    productID: 1, 
 
    weight: 3.5, 
 
    price: 5 
 
}, { 
 
    productID: 2, 
 
    weight: 4.5, 
 
    price: 8 
 
}, { 
 
    productID: 3, 
 
    weight: 1.5, 
 
    price: 9 
 
}, { 
 
    productID: 4, 
 
    weight: 2.5, 
 
    price: 3 
 
}, { 
 
    productID: 5, 
 
    weight: 7.5, 
 
    price: 1 
 
}]; 
 

 
$scope.deleteList = [1, 3]; 
 

 
for (var i = $scope.listOfItems.length; i--;) { 
 
    if ($scope.deleteList.indexOf($scope.listOfItems[i].productID) !== -1) { 
 
    \t $scope.listOfItems.splice(i ,1); 
 
    } 
 
} 
 

 
console.log($scope.listOfItems);
.as-console-wrapper {top: 0; max-height: 100%!important}

+0

Dies hat das gleiche Problem, überprüfen Sie bitte meine aktualisierte jsfiddle mit Ihrer Funktion – Jaaaaaaay

+0

@Jaaaaaaay - funktioniert es nicht gut? Sie wissen, dass Sie die 'productID', nicht den Index, überprüfen, also' [1,4] 'entfernt die Objekte mit diesen' productID's? – adeneo

+0

Wenn Sie den Index stattdessen möchten, ist das einfach -> http://jsfiddle.net/adeneo/Lvc0u55v/10725/ – adeneo

Verwandte Themen