我有两个数组。在每个数组中,我都有具有大量属性但没有方法的对象。 我需要看看数组1是否与数组2相等。
这样做的一种方法是创建一个函数,该函数遍历数组的每个元素,并将对象的每个属性与第二个数组中类似位置的对象进行比较。
问题是数组非常大,每个对象都有很多属性。如果可能有另一种方式,我在徘徊。例如,在C ++中,我可以读取内存...但我不知道如何在js中执行此操作。
我需要获得最佳方式,因为这是经常使用的函数的一部分。
答案 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()结合使用非常强大,可用于克隆对象