Bil*_*son 8 javascript arrays equality
在这个答案中,有一个简单的函数将返回包含原始值的数组的数组相等性.
但是,我不确定它为什么会起作用.这是功能:
function arrays_equal(a,b) { return !!a && !!b && !(a<b || b<a); }
Run Code Online (Sandbox Code Playgroud)
我对下半场最感兴趣; 这一点:
!(a<b || b<a)
Run Code Online (Sandbox Code Playgroud)
为什么<和>比较数组时工作,但==不?
如何在JavaScript中使用少于和多于方法?
pim*_*vdb 11
使用</ >,数组首先转换为字符串,因此不提供检查相等性的可靠方法.
== 不起作用,因为通过引用检查对象:
[] == []; // false, two separate objects
var a = [];
a == a; // true, refer to the same object
Run Code Online (Sandbox Code Playgroud)
该</ >诀窍是有缺陷的:
var a = [1, [2, 3]],
b = [[1, 2], 3];
!(a<b || b<a); // true
Run Code Online (Sandbox Code Playgroud)
这个求值为true,因为它们"1,2,3"在被检查之前都被转换为字符串(</ >不"直接"用于对象).
所以基本上,你要比较字符串的相等性.对于字符串,a == b确实与!(a<b || b<a)- </ >对于字符串检查字符代码相同,因此两个相等的字符串既不"小"也不"大",因为字符串中的任何字符代码都不是这种情况.
但是,我不确定它为什么会起作用.
它不起作用.考虑
arrays_equal(["1,2"], [1,2])
Run Code Online (Sandbox Code Playgroud)
即使通过基于元素比较的任何数组相等定义,它们也会生成true,它们是不同的.
arrays_equal([[]], [])
Run Code Online (Sandbox Code Playgroud)
和
arrays_equal([""], [])
Run Code Online (Sandbox Code Playgroud)
也是虚假的积极因素.
简单地添加length检查无助于证明
arrays_equal(["1,2",3], [1,"2,3"])
arrays_equal(
["",","],
[",",""])
Run Code Online (Sandbox Code Playgroud)
编辑:
如果你想要一种简洁的方法来测试结构相似性,我建议:
function structurallyEquivalent(a, b) {
return JSON.stringify(a) === JSON.stringify(b);
}
Run Code Online (Sandbox Code Playgroud)
它不会在明显不同的输入上提前停止 - 无论它们有多么不同,它都会遍历两个对象图,但OP中的功能也是如此.
一个警告:当你使用非本机时JSON.stringify,它可能会为循环输入做一些奇怪的事情,例如:
var input = [];
input[0] = input;
Run Code Online (Sandbox Code Playgroud)