比较对象数组,最佳方式

Posted

技术标签:

【中文标题】比较对象数组,最佳方式【英文标题】:Compare arrays of objects, optimal way 【发布时间】:2012-02-29 19:09:02 【问题描述】:

我有两个数组。在每个数组中,我都有具有很多属性但没有方法的对象。 我需要查看数组 1 是否与数组 2 相等。

一种方法是创建一个函数,该函数传递数组的每个元素,并将对象的每个属性与第二个数组中相似位置的对象进行比较。

问题是数组非常大,而且每个对象都有很多属性。如果还有其他方法,我正在徘徊。例如,在 C++ 中我可以读取内存......但我不知道如何在 js 中做到这一点。

我需要获得最佳方式,因为这是经常使用的功能的一部分。

【问题讨论】:

Compare javascript array of array by distinct values这个代码可以帮助你。 【参考方案1】:

除非它们是同一个数组实例,否则比较内存位置在 JavaScript 中不起作用(当您执行 arr1 == arr2 时会发生什么)。

您需要显式循环。

有些人在两个数组上都使用JSON.stringify()(注意pimvdb 在 cmets 中解释的问题)并将结果字符串与 cheat 进行比较,但序列化为字符串并比较声音对我来说太贵了。但是它可以工作,所以如果没有性能问题,那就发疯吧! :)

你也可以试试toSource()

我会构建自己的比较函数,该函数的比较刚好满足我的相同的想法。

【讨论】:

存在性能问题:)。如果我比较 arr1 == arr2 将始终返回 false,因为内存位置不同。我需要将该位置的内存与“在内存方面”的数组末尾进行比较,以便将第二个位置放在末尾。附:请原谅我的英语。 @zozo JavaScript 数组实际上是具有一些特殊方法和属性的对象。它们通常不像其他语言的数组实现那样按顺序存储。 您不能像在 C++ 中那样直接访问内存地址。 JavaScript 只是一个愚蠢的接口,你所能做的就是以某种方式比较对象。我也会使用JSON.stringify。还有uneval 是的...所以基本上我无法避免 2 个循环。这很糟糕。 :| JSON.stringify 似乎取决于添加属性的顺序。 JSON.stringify(a:1,b:2) === JSON.stringify(b:2,a:1) 产生 false,所以我真的不推荐它。【参考方案2】:

将您的数组转换为字符串,然后比较字符串将具有相同的平均性能和最差的性能:O(n)(线性)。

如果您遍历对象属性/数组并在第一次不匹配时中止,您的最差性能仍将是 O(n),但您的平均性能可能会显着提高,除非您比较的对象通常相同。无论哪种方式,由于这种遍历不包括创建任何新对象和复制字节 - 即使比较相同的复合对象/数组(最坏情况)仍然应该比将它们字符串化更快。

正如this 的回答建议你可以使用Underscore.js isEqual

根据文档:在两个对象之间执行优化的深度比较,以确定它们是否应该被视为相等

我很确定它也适用于数组。

【讨论】:

【参考方案3】:

JQuery 有一个名为 jQuery.param() 的函数,用于序列化对象

您可以像这样比较对象或对象数组,

$.param( originalObj ) == $.param( modifiedObj )

与jQuery.extend()结合使用非常强大,可以用来克隆对象

【讨论】:

以上是关于比较对象数组,最佳方式的主要内容,如果未能解决你的问题,请参考以下文章

在 ES6 JS 中“分组”对象数组的最佳方式?

Javascript:将数组转换为对象的最佳方法是啥? [复制]

在 GraphQL Schema 中定义地图对象的最佳方式?

将嵌套对象数组转换为对象数组的最佳方法

将数组从 JavaScript 传递到 C# 的最佳方法?

将对象数组减少到“最佳 10 个”