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)
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)
仅当在第二个数组中找到当前项时,如果数组长度不同,上面的两个答案都不计入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)
| 归档时间: |
|
| 查看次数: |
23177 次 |
| 最近记录: |