以下是问题:
比较两个数组并返回一个新数组,其中只有在两个给定数组之一中找到的任何项,但不能同时返回两个数组。换句话说,返回两个数组的对称差异。
这是我的代码:
function diffArray(arr1, arr2) {
var newArr = [];
// Same, same; but different.
for (i = 0; i < arr1.length; i++) {
for (j = 0; j < arr2.length; j++)
while (arr1[i] === arr2[j])
delete arr2[j];
newArr = arr2;
}
return newArr;
}
console.log(diffArray([1, 2, 3, 5], [1, 2, 3, 4, 5]));
&#13;
请告诉我我的错误。
答案 0 :(得分:-1)
您尝试完成的任务要求您创建新阵列,而是修改Map<>
。将未包含在另一个数组中的所有元素复制到新数组可能是最简单的,如下所示:
"LambdaInvokePermission": {
"Type": "AWS::Lambda::Permission",
"Properties": {
"FunctionName" : "arn:aws:lambda:us-east-1:[...]:function:snsToSlack",
"Action": "lambda:InvokeFunction",
"Principal": "sns.amazonaws.com",
"SourceArn": { "Ref": "GenericSlackAlertSNSTopic" }
}
}
如果您想尝试修改代码,我可以尝试再看看它。
答案 1 :(得分:-1)
我使用了Array.prototype.filter
方法:
function diffArray(arr1, arr2) {
var dif01 = arr1.filter(function (t) {
return arr2.indexOf(t) === -1;
});
var dif02 = arr2.filter(function (t) {
return arr1.indexOf(t) === -1;
});
return (dif01).concat(dif02);
}
alert(diffArray([1, 2, 3, 6, 5], [1, 2, 3, 4, 7, 5]));
如果您仍想使用代码并删除公共元素,请尝试使用Array.prototype.splice
方法而不是delete
:后者删除值,但保持索引为空,而{{1将删除给定范围内的整个索引,并重新索引范围旁边的项目。
答案 2 :(得分:-1)
试试这个:
function diffArray(arr1, arr2) {
var ret = [];
function checkElem(arrFrom, arrIn) {
for (var i = 0; i < arrFrom.length; ++i) {
var elem = arrFrom[i];
if (arrIn.indexOf(elem) === -1)
ret.push(elem);
}
}
checkElem(arr1, arr2);
checkElem(arr2, arr1);
return ret;
}
我希望这可以解决你的问题。
答案 3 :(得分:-1)
如果使用索引作为删除的引用,则会保留这些索引undefined
。
您必须使用push
添加项目,splice
删除项目。
function diffArray(arr1, arr2) {
var newArr = [];
for (i = 0; i < arr1.length; i++) {
for (j = 0; j < arr2.length; j++)
while (arr1[i] === arr2[j])
arr2.splice(j, 1);
newArr = arr2;
}
return newArr;
}
console.log(diffArray([1, 2, 3, 5], [1, 2, 3, 4, 5]));
这应该可以工作,但是我发现了一种不同的方法,它可以为极短的数组花费更多的时间,但是比长数组的第一种方式花费的时间要少得多。
看看fiddle。
这是我方法的代码:
function diffArray(arr1, arr2) {
let obj1 = {}, obj2 = {};
for (let l = arr1.length, i = 0; i < l; i++)
obj1[arr1[i]] = undefined;
for (let l = arr2.length, i = 0; i < l; i++)
obj2[arr2[i]] = undefined;
let a = [];
for (let arr = arr1.concat(arr2), l = arr.length, i = 0, item = arr[0]; i < l; i++, item = arr[i])
if (item in obj1 !== item in obj2)
a.push(item);
return a;
}
console.log(diffArray([1, 2, 3, 5], [1, 2, 3, 4, 5]));
答案 4 :(得分:-1)
您可以使用Array.prototype.filter
:
var array1 = [1, 2, 3, 5];
var array2 = [1, 2, 3, 4, 5];
var filteredArray = filter(array1, array2).concat(filter(array2, array1));
function filter(arr1, arr2) {
return arr1.filter(function(el) { return arr2.indexOf(el) < 0; });
}
Here是一个有效的JSFiddle。