比较两个重复对象的对象数组,并在JavaScript中不重复时将其推送

时间:2016-04-14 23:33:24

标签: javascript arrays javascript-objects

这个问题可能与我几小时前提到的this question太相似了,但我遇到的问题实际上比我最初想的要复杂得多。我没有意识到,即使两个对象具有相同的属性和值集,在JavaScript中也不能认为两个对象是相同的。

我在JavaScript中有两个这样的对象数组。

var from = [
    {city: "seoul", country: "korea"},
    {city: "tokyo", country: "japan"},
    {city: "beijing", country: "china"},
    {city: "new york", country: "usa"}
];
var to = [
    {city: "seoul", country: "korea"},
    {city: "tokyo", country: "japan"},
    {city: "toronto", country: "canada"}
];

我想要做的是检查"来自"中的任何对象。数组已经在"到"数组并将对象推送到"到"数组只有当它不在"到"数组,我想只添加一个来自"来自"阵列到"到"数组,即使"来自"中有其他对象。不在"到"的数组阵列。换句话说,我想在对象被推送到"到#34;之后立即突破循环。阵列。

最后,我希望"到#34;数组看起来像这样。

var target = {
    {city: "seoul", country: "korea"},
    {city: "tokyo", country: "japan"},
    {city: "toronto", country: "canada"},
    {city: "beijing", country: "china"}
};

我想出了一个实现这种效果的功能。

function ruthere (source, target) {
    for (var i = 0; i < target.length; i++) {
        for (var j = 0; j < source.length; j++) {
            if (target[i].city == source[j].city) {
                console.log("Already there");
            } else {
                target.push(source[j]);
                i = target.length-1;
                break;
            }
        }
    }
}

这是我已经达到了我想要的结果,但这仍然没有达到我想要的效果。

* edit:我只需要检查一个对象的name属性的值是否相同。国家财产的价值不必相同。

3 个答案:

答案 0 :(得分:2)

你的代码有些问题:你需要一个嵌套循环,但不是为什么你在这里做。如果目标数组中的城市与源数组中的城市不完全相同,则某些城市可能永远不会被推送到目标数组。城市也可以有相同的名称,但在不同的国家。

假设您可以使用ES5功能:

function ruthere(source, target) {
    for (var i = 0; i < source.length; i++) {
        var srcObj = source[i];
        var tarObj = target.find(function (obj) {
            return obj.city === srcObj.city && obj.country === srcObj.country;
        });

        if (!tarObj) {
            target.push(srcObj);
            break;
        }
    }

    return target;
}

编辑:我错了,Array.prototype.find是ES6,而不是ES5。这是ES3版本:

function ruthere(source, target) {
    for (var i = 0; i < source.length; i++) {
        var srcObj = source[i];
        var tarObj;
        for (var j = 0; j < target.length; j++) {
            var obj = target[j];
            if (srcObj.city === obj.city && srcObj.country === obj.country) {
                tarObj = obj;
                break;
            }
        }

        if (!tarObj) {
            target.push(srcObj);
            break;
        }
    }

    return target;
}

答案 1 :(得分:1)

只需使用;

&#13;
&#13;
ForEach( $User in (Get-ADUser -Filter * | Where{$_.Home -ne "H:" -or $_.HomeDirectory -ne ('\\server\home$\' + $_.SamAccountName)}) ){  
    Set-ADUser $User -HomeDrive "H:" -HomeDirectory('\\HYDAD1\home$\' + $_.SamAccountName)  
}
&#13;
var from = [{
    city: "seoul",
    country: "korea"
}, {
    city: "tokyo",
    country: "japan"
}, {
    city: "beijing",
    country: "china"
}, {
    city: "new york",
    country: "usa"
}];
var to = [{
    city: "seoul",
    country: "korea"
}, {
    city: "tokyo",
    country: "japan"
}, {
    city: "toronto",
    country: "canada"
}];

function ruthere(source, target) {
    for (var i = 0; i < source.length; i++) {
        if (source[i].city !== target[i].city) {
            target.push(source[i])
        }
    }
    for (var i = 0; i < target.length; i++) {
		$(".city").append((i + 1) + " " + target[i].city + "<br>")
    }
}
ruthere(from, to)
&#13;
&#13;
&#13;

答案 2 :(得分:-2)

我会考虑使用下划线来帮助您实现这一目标: Underscore.js

这个答案可能是一个非常有用的答案: https://stackoverflow.com/a/28632359/5768113