如果值匹配,如何从数组中删除元素

How to remove element from array if values matched?

本文关键字:数组 删除 元素 如果      更新时间:2023-09-26

如果我在对象中找到值,我想从数组中删除这些值。

完成这项任务的最佳解决方案是什么?

控制.js

  var selectedOwners = [];
            $scope.deleteOwner = function(dataItem){
                var workerKey;
                var fullName;
                angular.forEach(selectedOwners,function(val,index){
                  workerKey = val.workerKey;
                  fullName = val.fullName;
                })
                if(dataItem.workeyKey === workerKey || dataItem.fullName === fullName){ 
                  selectedOwners.splice(workerKey,fullName);
                }      
            }

数组和对象

Array  selectedOwners = [{"fullName":"Johnson, Rocio","workerKey":3506},{"fullName":"Johnson, John S.","workerKey":571},{"fullName":"Johnson, Camille A.","workerKey":1368}]
Object {
    "workerKey": 3506,
    "fullName": "Johnson, Rocio",
}

应该像这样简单:

var selectedOwners = [{
    "fullName": "Johnson, Rocio",
    "workerKey": 3506
}, {
    "fullName": "Johnson, John S.",
    "workerKey": 571
}, {
    "fullName": "Johnson, Camille A.",
    "workerKey": 1368
}];
var obj = {
    "workerKey": 3506,
    "fullName": "Johnson, Rocio",
};

for (var i = 0; i < selectedOwners.length; i++) {
    if (selectedOwners[i].workerKey === obj.workerKey) {
        selectedOwners.splice(i, 1);
        break;
    }
}

请记住,for 循环假定 workerKey 在数组中是唯一的。这就是为什么我们只需要在 workerKey 属性上进行比较,并且在找到匹配项后也会突破 for 循环。

下面是如果 workerKey 不是唯一的循环:

for (var i = 0; i < selectedOwners.length; i++) {
    if (selectedOwners[i].workerKey === obj.workerKey &&
        selectedOwners[i].fullName === obj.fullName) {
        selectedOwners.splice(i, 1);
        // we need to decrement i by one because
        // we just removed an element from the array
        i--;
    }
}

使用 indexOf 获取拼接的位置;

由于您将对象作为数据项传递,因此可以执行以下操作:

$scope.deleteOwner = function(dataItem){
    selectedOwners.splice(indexOf(dataItem), 1);
}

你可以使用 lodash _.remove 这很简单

_.remove(selectedOwners , {
          "fullName": "Johnson, Rocio",
          "workerKey": 3506    //where condition
     });

你可以使用 grep 函数,如下所示:

$scope.deleteOwner = function(dataItem){
            selectedOwners = $.grep(selectedOwners, function(value) {
                return value.workerKey != dataItem.workerKey 
                     && value.fullName!= dataItem.fullName;
            });      
        }

我认为最好的主意是只使用过滤器数组的方法。没有外部 JS 依赖项。

var selectedOwners = [{"fullName":"Johnson, Rocio","workerKey":3506},{"fullName":"Johnson, John S.","workerKey":571},{"fullName":"Johnson, Camille A.","workerKey":1368}]
var item = {
    "workerKey": 3506,
    "fullName": "Johnson, Rocio",
}
var resultArray = selectedOwners.filter(function(i){ 
   return !(i.fullname == item.fullname && i.workerKey == item.workerKey)
});