Исключить некоторые свойства в сравнении, используя isEqual() lodash

Я использую _. isEqual, который сравнивает 2 массива объектов (например: 10 свойств каждого объекта), и он работает нормально.

Теперь есть 2 свойства (создание и удаление), которые мне не нужны, чтобы быть частью сравнения.

Пример:

var obj1 = {name: "James", age: 17, creation: "13-02-2016", deletion: "13-04-2016"}
var obj2 = {name: "Maria", age: 17, creation: "13-02-2016", deletion: "13-04-2016"}

// lodash method...
_.isEqual(firstArray, secondArray)

Ответ 1

Вы можете использовать omit() для удаления определенных свойств в объекте.

var result = _.isEqual(
  _.omit(obj1, ['creation', 'deletion']),
  _.omit(obj2, ['creation', 'deletion'])
);

var obj1 = {
  name: "James",
  age: 17,
  creation: "13-02-2016",
  deletion: "13-04-2016"
};

var obj2 = {
  name: "Maria",
  age: 17,
  creation: "13-02-2016",
  deletion: "13-04-2016"
};

var result = _.isEqual(
  _.omit(obj1, ['creation', 'deletion']),
  _.omit(obj2, ['creation', 'deletion'])
);

console.log(result);
<script src="https://cdn.jsdelivr.net/lodash/4.13.1/lodash.min.js"></script>

Ответ 2

Вы можете map ваш массив в "очищенный" массив, а затем сравнить их.

// Create a function, to do some cleaning of the objects.
var clean = function(obj) {
    return {name: obj.name, age: obj.age};
};

// Create two new arrays, which are mapped, 'cleaned' copies of the original arrays.
var array1 = firstArray.map(clean);
var array2 = secondArray.map(clean);

// Compare the new arrays.
_.isEqual(array1, array2);

Это имеет недостаток, что функция clean должна быть обновлена, если объекты ожидают каких-либо новых свойств. Его можно отредактировать так, чтобы он удалял два нежелательных свойства.

Ответ 3

Я вижу два варианта.

1) Сделайте вторую копию каждого объекта, который не содержит создание или дату.

2) Прокрутите все свойства и, предположив, что вы точно знаете, что оба они имеют одинаковые свойства, попробуйте что-то вроде этого.

var x ={}
var y ={}
for (var property in x) {
if(property!="creation" || property!="deletion"){
if (x.hasOwnProperty(property)) {
        compare(x[property], y[property])
    }
}
}

Где compare() - это простое сравнение строк или объектов. Если вы уверены в свойствах на одном или обоих объектах, вы можете упростить этот код немного дальше, но это должно работать в большинстве случаев.

Ответ 4

@ryeballar ответ не подходит для больших объектов, потому что вы создаете глубокую копию каждого объекта каждый раз, когда выполняете сравнение.

Лучше использовать isEqualWith, например

var result = _.isEqualWith(obj1, obj2, (value1, value2, key) => {
    return key === "creation" || key === "deletion" ? true : undefined;
});

Обратите внимание, что если вы пишете для ES5 и ранее, вам придется заменить синтаксис стрелки (() => {) на синтаксис функции (function() {)