从另一个数组中的Javascript数组中删除元素

时间:2016-02-19 04:50:58

标签: javascript arrays angularjs

我在Angularjs应用程序中编写了一个javascript函数。我需要做的就是删除arr1中的所有项目,这些项目也包含在arr2中(在arr2中重复)。

//array1 = array1 - array2
        $rootScope.removeArrayDuplicated = function (arr1, arr2) {
            console.log('before');
            console.log(arr1);
            for (var i = 0; i < arr2.length; i++) {
                Inner:  for (var j = 0; j < arr1.length; j++) {

                    if (arr2[i].name == arr1[j].name) {
                        console.log("inside " + arr2[i].name + " " + arr1[j].name);

                        arr1.splice(j, 1);
                        j--;
                        break Inner;
                    }
                }
            }
            console.log('after');
            console.log(arr1);
            return arr1;
        }

我在值之前和之后打印arr1的值。但是我在数组之前和之后得到相同的数组。我可能犯了一个错误。请告诉我。

*数组包含json对象

3 个答案:

答案 0 :(得分:0)

如果您使用Array.prototype.filter

,这非常简单
var newArr = arr1.filter(function(item) {
  return arr2.indexOf(item) == -1;
});

根据项目的名称,您似乎在“删除”。我可能会将所有名称放在地图中以便更快地查找:

var dedupe = function(arr1, arr2) {
  var nameMap = {};
  arr2.forEach(function(item) {
    nameMap[item.name] = true;
  });
  return arr1.filter(function(item) {
    return !!nameMap[item.name];
  });
});

第二个版本应该按比例缩放为O(N)(与原来的比例为O(N ^ 2))。

答案 1 :(得分:0)

这应该有效

$scope.removeArrayDuplicated = function(arr1, arr2) {
  return arr1.filter(item => !(arr2.some(item2 => item.name === item2.name)));
}

Here is a working demo.

这是通过Babel

转换的es5代码
$scope.removeArrayDuplicated = function (arr1, arr2) {
  return arr1.filter(function (item) {
    return !arr2.some(function (item2) {
      return item.name === item2.name;
    });
  });
};

答案 2 :(得分:0)

您是否需要编辑原始数组,还是可以构建新的输出数组?

如果你可以构建一个新的输出数组,那么你正在寻找:

    $rootScope.removeArrayDuplicated = function (arr1, arr2) {
    var outputArray = [];

    for (var i = 0; i < arr2.length; i++) {
        var duplicate = false;
        Inner:  for (var j = 0; j < arr1.length; j++) {

            if (arr2[i].name == arr1[j].name) {
                console.log("inside " + arr2[i].name + " " + arr1[j].name);
                duplicate = true;
                break Inner;
            }
        }

        if(!duplicate) {
            outputArray.push(arr2[i].name);
        }
    }
    return outputArray;
}