我在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对象
答案 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)));
}
这是通过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;
}