【问题标题】:Comparing two arrays of objects for duplicate objects and push it when it's not a duplicate in JavaScript比较两个对象数组中的重复对象并在 JavaScript 中不重复时推送它
【发布时间】:2016-08-06 18:11:40
【问题描述】:

这个问题可能与我几个小时前问的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"}
];

我想要做的是检查“from”数组中的任何对象是否已经在“to”数组中,并且只有当它不在“to”中时才将对象推送到“to”数组数组,并且我只想将“from”数组中的一个对象添加到“to”数组中,即使“from”数组中有其他对象不在“to”数组中。换句话说,我想在将对象推送到“to”数组后立即跳出循环。

最后,我希望“to”数组看起来像这样。

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属性的值是否相同。国家财产的价值不必相同。

【问题讨论】:

  • (target[i].name 您的示例对象没有“名称”属性。你可能希望这个阅读(target[i].city
  • @Hamms 对不起。这是一个错字。
  • 还要注意break 只会跳出最里面的for 循环,而不是两者。你可能想return

标签: javascript arrays javascript-objects


【解决方案1】:

您的代码有一些问题:您确实需要一个嵌套循环,但不是因为您在这里这样做。如果目标数组中的城市与源数组中的城市不完全相同,那么有些可能永远不会被推送到目标数组。城市也可以具有相同的名称,但位于不同的国家/地区。

假设您可以使用 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;
}

【讨论】:

  • .find 不是 ES6(不是 ES5)数组方法吗?
  • find 目前在 IE 或 Opera 中不受支持
  • 我的错。我在答案中添加了一个不使用Array.prototype.find 的版本
【解决方案2】:

随便用;

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)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="city"></div>

【讨论】:

  • 纯代码答案没有帮助。您应该解释 OP 的问题(问题中并不清楚)以及您的答案如何解决它。否则你只是一个免费的编码服务。
【解决方案3】:

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

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

【讨论】:

  • 这个答案的任何部分都没有真正回答这个问题。这只是答案的链接。
  • 我的错误,我以为他想遍历一个对象并检查它是否存在于另一个对象中。我可能误以为我提供的答案没有帮助。我的错。
  • 不是这样,那些是有用的链接。但是在 StackOverflow 上,您不能只发布链接的答案。您必须包含链接的内容以及如何使用它来回答 OP 的问题。
  • 我明白了,我很抱歉。对不起,我以后会尽量坚持这一点。谢谢你帮我清理。
猜你喜欢
  • 2021-05-09
  • 2020-05-11
  • 2020-05-08
  • 1970-01-01
  • 2021-09-15
相关资源
最近更新 更多