与lodash深度比较的对象数组

Arc*_*her 14 javascript arrays javascript-objects lodash

我有两个与我深深比较的对象阵列 lodash

但是,我有一个问题:

> var x = [{a:1, b:2}, {c:3, d:4}];
> var y = [{b:2, a:1}, {d:4, c:3}];
> _.difference(x,y, _.isEqual);
[ { a: 1, b: 2 }, { c: 3, d: 4 } ]
Run Code Online (Sandbox Code Playgroud)

我应该如何比较看两者是否相等?

rye*_*lar 32

您可以将differenceWith()isEqual()比较器一起使用,并调用isEmpty来检查它们是否相等.

var isArrayEqual = function(x, y) {
  return _(x).differenceWith(y, _.isEqual).isEmpty();
};

var result1 = isArrayEqual(
  [{a:1, b:2}, {c:3, d:4}],
  [{b:2, a:1}, {d:4, c:3}]
);

var result2 = isArrayEqual(
  [{a:1, b:2, c: 1}, {c:3, d:4}],
  [{b:2, a:1}, {d:4, c:3}]
);

document.write([
  '<div><label>result1: ', result1, '</label></div>',
  '<div><label>result2: ', result2, '</label></div>',
].join(''));
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.11.2/lodash.js"></script>
Run Code Online (Sandbox Code Playgroud)

更新2018年6月22日

此更新是对以下评论的回应:

@ryeballar如果任何数组未定义则返回true.你怎么解决这个问题 在此提前感谢好友

differenceWith文档中所述:

结果值的顺序和引用由第一个数组确定.

这意味着只要第一个数组中的所有项都匹配第二个数组中的其他所有项,那么differenceWith调用的结果数组将为空.

真正解决问题的另一种解决方案是使用xorWith()上述解决方案中的相同功能链.

var isArrayEqual = function(x, y) {
  return _(x).xorWith(y, _.isEqual).isEmpty();
};

var result1 = isArrayEqual(
  [{a:1, b:2}, {c:3, d:4}],
  [{b:2, a:1}, {d:4, c:3}]
);

var result2 = isArrayEqual(
  [{a:1, b:2, c: 1}, {c:3, d:4}],
  [{b:2, a:1}, {d:4, c:3}]
);

var result3 = isArrayEqual(
  [{a:1, b:2, c: 1}, {c:3, d:4}],
  [{b:2, a:1}, {d:4, c:3}, undefined]
);

console.log('result1:', result1);
console.log('result2:', result2);
console.log('result3:', result3);
Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper{min-height:100%;top:0}
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

  • 我从来没有见过lodash中提到的`_(foo)`的语法.文档在哪里? (3认同)
  • 您可以简单地要求每个函数,然后像以非链式方式一样使用它们。`isEmpty(xorWith(x, y, isEqual))` (3认同)
  • @DonP您可以参考[lodash文档的此部分](https://lodash.com/docs/4.17.4#lodash)。 (2认同)
  • @ryeballar ,你能展示一下,我如何使用单独安装的组件实现 `_(x)`,因为我不需要整个 `lodash`?我找到了`lodash.isequal`(即`npm i --save lodash.isequal`)、`lodash.xorwith`、`lodash.isequal`、`lodash.isempty`,但我不知道要为`_安装什么(x)`。 (2认同)

Ani*_*ita 16

按照@ryeballar 的回答,如果您只想导入特定的 lodash 方法,您可以使用以下表示法:

import { isEmpty, isEqual, xorWith } from 'lodash';


export const isArrayEqual = (x, y) => isEmpty(xorWith(x, y, isEqual));

Run Code Online (Sandbox Code Playgroud)


Ang*_*odi 6

仅当在第二个数组中找到当前项时,如果数组长度不同,上面的两个答案都不计入xorWith计数。differenceWith

var isArrayEqual = function(x, y) {
  return _(x).xorWith(y, _.isEqual).isEmpty();
};

var result = isArrayEqual(
  [{a:1, b:2}],
  [{a:1, b:2}, {a:1, b:2}]
);


console.log('result should be false:', result);
Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper{min-height:100%;top:0}
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

在这种特殊情况下,我们还必须比较两个数组的长度。

const isArrayEqual = function(x, y) {
  const isSameSize = _.size(x) === _.size(y);
  return isSameSize && _(x).xorWith(y, _.isEqual).isEmpty();
};

const result = isArrayEqual(
  [{a:1, b:2}],
  [{a:1, b:2}, {a:1, b:2}]
);


console.log('result should be false:', result);
Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper{min-height:100%;top:0}
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>
Run Code Online (Sandbox Code Playgroud)