在js中比较2个对象的最快方法

Ten*_*nho 5 javascript angular angular6

在javascript中比较2个对象的最快方法是什么?

例如我有这两个对象:

a = [{'name': 'john', 'age': 22}, {'name': 'mike', 'age': 23}, {'name': 'anne', 'age': 12}, {'name': 'dan', 'age': 29}, {'name': 'jane', 'age': 34}]
b = [{'name': 'john', 'age': 22}, {'name': 'anne', 'age': 12}]
Run Code Online (Sandbox Code Playgroud)

通常,我会这样做:

for (var i = 0; i < a.length; i++) {
    for (var j = 0; j < b.length; j++) {
        console.log(a[i]) // => [{'name': 'john', 'age': 22}, {'name': 'anne', 'age': 12}]
    }
}
Run Code Online (Sandbox Code Playgroud)

这花费的时间太长了,还有其他更快的方法吗?感谢您的时间!

小智 17

我没有足够的代表来添加评论来解释Neha Mundra 的回答[如下],所以我想我应该发帖。

let a={a:20,b:10};
let b={b:10,a:20};

console.log(Object.entries(a).sort().toString()===
            Object.entries(b).sort().toString()) //true
Run Code Online (Sandbox Code Playgroud)
  1. Object.entries(a)/Object.entries(b)返回对象的内容
  2. .sort()按键值 ( a/ b) 对它们进行排序,正如您在示例中看到的,声明时键是相反的,这将确保它们的比较顺序相同。
  3. .toString返回对象的字符串表示形式。
  4. 运算===符正在检查两个字符串是否相等。

希望这可以帮助某人。如果您不确定发生了什么,也可以在浏览器开发控制台中进行检查。


Isa*_*aac 12

你可以看看fast-deep-equal包。这是他们 README.md 中的性能基准,供您参考。

fast-deep-equal x 226,960 ops/sec ±1.55% (86 runs sampled)
nano-equal x 218,210 ops/sec ±0.79% (89 runs sampled)
shallow-equal-fuzzy x 206,762 ops/sec ±0.84% (88 runs sampled)
underscore.isEqual x 128,668 ops/sec ±0.75% (91 runs sampled)
lodash.isEqual x 44,895 ops/sec ±0.67% (85 runs sampled)
deep-equal x 51,616 ops/sec ±0.96% (90 runs sampled)
deep-eql x 28,218 ops/sec ±0.42% (85 runs sampled)
assert.deepStrictEqual x 1,777 ops/sec ±1.05% (86 runs sampled)
ramda.equals x 13,466 ops/sec ±0.82% (86 runs sampled)
The fastest is fast-deep-equal
Run Code Online (Sandbox Code Playgroud)


小智 6

let a={a:20,b:10};
let b={b:10,a:20};

console.log(Object.entries(a).sort().toString()===
            Object.entries(b).sort().toString()) //true
Run Code Online (Sandbox Code Playgroud)

  • 应该注意的是,例如,这对于比一个键更深的对象不起作用。以下将失败: {a:20,b:{a1:'1', a2:'2'}}; (7认同)
  • 还可以添加几行文字来讨论您提供的解决方案 (2认同)