Массив объекта глубокого сравнения с lodash
У меня есть 2 массива объектов, которые я бы сравнил с 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 } ]
Как я могу сравнить, чтобы оба равны?
Ответы
Ответ 1
Вы можете использовать разностьWith() с компаратором 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(''));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.11.2/lodash.js"></script>
Ответ 2
Я предпочитаю чистый JS, так как у меня нет терпения, чтобы выучить подчеркивание или lodash. Поэтому я изобретаю то, о чем я давно мечтал. Object.prototype.compare()
. V0.0.2 делает только мелкое сравнение, хотя и адекватное для этого вопроса.
Object.prototype.compare = function(o){
var ok = Object.keys(this);
return typeof o === "object" && ok.length === Object.keys(o).length ? ok.every(k => this[k] === o[k]) : false;
};
var obj1 = {a:1,b:2,c:3},
obj2 = {c:3,a:1,b:2},
obj3 = {b:2,c:3,a:7};
document.write ("<pre>" + obj1.compare(obj2) + "</pre>\n");
document.write ("<pre>" + obj2.compare(obj3) + "</pre>\n");
document.write ("<pre>" + new Object({a:1, b:2, c:3}).compare({c:3,b:2,a:1,d:0}) + "</pre>\n");
Ответ 3
После ответа @ryeballar, если вы хотите импортировать только определенные методы lodash, вы можете использовать эту запись:
import { isEmpty, isEqual, xorWith } from 'lodash';
export const isArrayEqual = (x, y) => isEmpty(xorWith(x, y, isEqual));