2016-10-12 3 views
0

У меня есть проблемы с удалением элементов из массива на основе сопоставленного значения. У меня есть массив объектов, как показано ниже:Удалить несколько элементов из массива на основе сопоставленного значения

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

И я хочу, чтобы удалить элементы на основе массива ProductID, как показано ниже:

$scope.deleteList = [1,3]; 

Теперь я пытаюсь использовать две петли, чтобы проверить, productID, если каждый продукт совпадает с любым идентификатором productID в deleteList.

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

Проблема это, после того, как она удаляет один с INDEX1, то index3 будет index2, таким образом, он будет удалять product2 и product5 вместо product2 и product4, что это неправильно. Также производительность будет плохой, если у меня будет большое количество объектов в массиве, и я хочу удалить половину из них. Любая идея, что я могу удалить правильную запись и улучшить производительность, если это возможно?

Работа jsfiddle http://jsfiddle.net/Lvc0u55v/10726/

+0

У вас есть какие-либо проблемы с созданием нового массив вместо изменения на месте? –

+0

Нажмите «<>» и создайте [mcve] – mplungjan

+0

. Я предпочитаю не создавать новый массив, потому что у моего html есть набор данных с массивом listOfItems – Jaaaaaaay

ответ

1

Вы можете перебирать в обратном направлении, таким образом сращивание не влияют на предыдущие показатели

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

У этой же проблемы, пожалуйста, проверьте мой обновленный jsfiddle с помощью вашей функции – Jaaaaaaay

+0

@Jaaaaaaay - не работает ли это нормально? Вы знаете, что вы проверяете 'productID', а не индекс, поэтому' [1,4] 'удаляет объекты с этими' productID''ами? – adeneo

+0

Если вы хотите использовать индекс, это легко -> http://jsfiddle.net/adeneo/Lvc0u55v/10725/ – adeneo