从数组中删除数据,将其与其他数组进行比较

时间:2016-06-10 12:13:19

标签: javascript arrays

我正在尝试比较“item”数组和copyofOpList数组中的项目以检索copyofOpList中的数据实例

这是我的尝试:

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

copyofOpList数组有14个元素,而item数组有2个数组 但是我的代码只删除了一次(第一次),所以请问我如何纠正我的代码,检索copyofOpList数组中与item数组相比的任何异常 谢谢你的帮助

2 个答案:

答案 0 :(得分:3)

我会尽量避免在循环中循环 - 这既不是非常优雅也不是非常有效的方式来获得你想要的结果。

这是更优雅,更有效的方式:

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

由于我刚刚注意到你正在比较对象属性,这里是一个过滤匹配对象属性的版本:

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

以这种方式执行此操作的另一个好处是,您可以避免在仍然对其进行操作时修改阵列,这是JonSG和Furhan S.在答案中提到的积极效果。

答案 1 :(得分:2)

拼接会改变你的阵列。使用临时缓冲区数组来获取新值,如下所示:

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