比较对象数组,最佳方式

时间:2012-02-08 10:46:43

标签: javascript arrays object optimization compare

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

这样做的一种方法是创建一个函数,该函数遍历数组的每个元素,并将对象的每个属性与第二个数组中类似位置的对象进行比较。

问题是数组非常大,每个对象都有很多属性。如果可能有另一种方式,我在徘徊。例如,在C ++中,我可以读取内存...但我不知道如何在js中执行此操作。

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

3 个答案:

答案 0 :(得分:4)

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

您需要明确循环。

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

您也可以尝试toSource()

我会建立自己的比较函数,只需要比较我满足相同的想法即可。

答案 1 :(得分:1)

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

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

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

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

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

答案 2 :(得分:0)

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

您可以比较对象或对象数组,如

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

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