简体   繁体   中英

Remove data from an array comparing it to an other array

I am trying to compare the items in "item" array and the copyofOpList array to retrieve the data occurrences in copyofOpList

this is my try:

var _deleteUsedElement1 = function(item) {

                    for (var i = 0; i < item.length-1; i++){      
                          for (var j = 0; j< $scope.copyofOpList.length-1; j++){
                        if (item[i].operationCode == $scope.copyofOpList[j].code) {
                        $scope.copyofOpList.splice(j, 1);

                        } } } };

 $scope.compareArrays = function() {
     ...Get data from web Service
    _deleteUsedElement1(item);
  }

the copyofOpList array has 14 elements,and the item array has 2 array but my code deletes only one occurrence (the first),so please how can I correct my code,to retrieve any occurances in the copyofOpList array comparing to the item array thanks for help

I'd try to avoid looping inside a loop - that's neither a very elegant nor a very efficient way to get the result you want.

Here's something more elegant and most likely more efficient:

var item = [1,2], copyofOpList = [1,2,3,4,5,6,7];

var _deleteUsedElement1 = function(item, copyofOpList) {
    return copyofOpList.filter(function(listItem) {
     return item.indexOf(listItem) === -1;
   });
  };

    copyofOpList = _deleteUsedElement1(item, copyofOpList);
    console.log(copyofOpList);
    //prints [3,4,5,6,7]
}

And since I just noticed that you're comparing object properties, here's a version that filters on matching object properties:

var item = [{opCode:1},{opCode:2}],
    copyofOpList = [{opCode:1},{opCode:2},{opCode:3},{opCode:4},{opCode:5},{opCode:6},{opCode:7}];

var _deleteUsedElement1 = function(item, copyofOpList) {
      var iOpCodes = item.map(function (i) {return i.opCode;});
      return copyofOpList.filter(function(listItem) {
        return iOpCodes.indexOf(listItem.opCode) === -1;
      });
    };

copyofOpList = _deleteUsedElement1(item, copyofOpList);
console.log(copyofOpList);
//prints [{opCode:3},{opCode:4},{opCode:5},{opCode:6},{opCode:7}]

Another benefit of doing it in this manner is that you avoid modifying your arrays while you're still operating on them, a positive effect that both JonSG and Furhan S. mentioned in their answers.

Splicing will change your array. Use a temporary buffer array for new values like this:

var _deleteUsedElement1 = function(item) {
    var _temp = [];
    for (var i = 0; i < $scope.copyofOpList.length-1; i++){      
        for (var j = 0; j< item.length-1; j++){
           if ($scope.copyofOpList[i].code != item[j].operationCode) {
               _temp.push($scope.copyofOpList[j]);
           } 
        } 
    } 
    $scope.copyofOpList = _temp;
};

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM