概念:在 JavaScript 中比较对象和数组,如字符串和数字
Concept: Comparing objects and arrays like atrings and numbers in JavaScript
有没有办法通过字符串或数字等字面值来比较两个未引用的对象?
_is = function (a, b) { /* Code */ }
这可以适用于任何对象类型,甚至是自定义对象。
_is(new X("a"), new X("a")); // Returns True;
_is(new X("a"), new Y("a")); // Returns False
您可以将其转换为字符串,但这样会很草率。
JSON.stringify({ x: "a" }) == JSON.stringify({ x: "a" }); // Returns True
也许有一种方法可以以编程方式读取对象的每个键、子键和值,并以这种方式进行比较。
有什么想法吗?
Javascript 使用唯一的内存指针对内存中的对象进行哈希处理。您实质上是在创建两个单独的对象,并尝试比较它们。尽管它们看起来相似,但实际上它们是不同的。
首先尝试将对象存储为变量,然后针对该变量进行测试。
pass = arg => { return arg }; pass({ a: "x" }); // Returns The Input
pass(({ a: "x" })) == ({ a: "x" }); // Returns False
var obj = {a: "x"};
pass(obj) === (obj); // Returns true
console.log(pass(obj) === (obj));
更新:
如果你想比较两个单独的对象,我发现最好和最有效的方法是创建两个对象的散列,然后比较散列(基本上是比较两个校验和)。如果哈希匹配,则对象相同。如果哈希值不同,则它们是不同的对象。您可以假设每个对象的属性和值都相同,因为使用散列函数,甚至可以利用某些形式的加密(如 md5 和 sha)中使用的散列函数来生成对象的唯一散列。
Here's a 3rd Party Library I've used before to generate object hashes.
有没有办法通过字符串或数字等字面值来比较两个未引用的对象?
_is = function (a, b) { /* Code */ }
这可以适用于任何对象类型,甚至是自定义对象。
_is(new X("a"), new X("a")); // Returns True;
_is(new X("a"), new Y("a")); // Returns False
您可以将其转换为字符串,但这样会很草率。
JSON.stringify({ x: "a" }) == JSON.stringify({ x: "a" }); // Returns True
也许有一种方法可以以编程方式读取对象的每个键、子键和值,并以这种方式进行比较。
有什么想法吗?
Javascript 使用唯一的内存指针对内存中的对象进行哈希处理。您实质上是在创建两个单独的对象,并尝试比较它们。尽管它们看起来相似,但实际上它们是不同的。
首先尝试将对象存储为变量,然后针对该变量进行测试。
pass = arg => { return arg }; pass({ a: "x" }); // Returns The Input
pass(({ a: "x" })) == ({ a: "x" }); // Returns False
var obj = {a: "x"};
pass(obj) === (obj); // Returns true
console.log(pass(obj) === (obj));
更新:
如果你想比较两个单独的对象,我发现最好和最有效的方法是创建两个对象的散列,然后比较散列(基本上是比较两个校验和)。如果哈希匹配,则对象相同。如果哈希值不同,则它们是不同的对象。您可以假设每个对象的属性和值都相同,因为使用散列函数,甚至可以利用某些形式的加密(如 md5 和 sha)中使用的散列函数来生成对象的唯一散列。
Here's a 3rd Party Library I've used before to generate object hashes.