[4,null,6]和[4,6]之间有什么区别

时间:2017-12-28 17:03:57

标签: javascript arrays array-difference

以下是问题:

  

比较两个数组并返回一个新数组,其中只有在两个给定数组之一中找到的任何项,但不能同时返回两个数组。换句话说,返回两个数组的对称差异。

这是我的代码:



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;
&#13;
&#13;

请告诉我我的错误。

5 个答案:

答案 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。