У меня два массива src
и update
. Оба содержат объекты. Входящий JSON из API, объекты в массивах следуют той же структуре (см. Ниже).
Я хочу сравнить src
с update
и добавить/удалить/обновить элементы в src
, которые представили изменения в update
.
Мой текущий процесс включает в себя итерацию массивов и сравнение элементов с помощью JSON.stringify()
, выполнение нескольких проходов. Передайте один, чтобы добавить, передать два, чтобы удалить, и передать три для обнаружения изменений для замены (я заменяю весь объект, а не поля).
Есть ли более простой/лучший способ?
Есть ли общая утилита, которая поможет вам в этом, или я должен написать свою собственную систему обнаружения diff?
EDIT: объекты внутри массивов выглядят как (но не ограничиваясь ими):
[
{
id: String,
summary: String,
updates: [
{
date: String,
title: String
},
{ Repeated }
]
},
{ Repeated }
]
Если я правильно понимаю ваш вопрос, ваш массив "updates" и "src" имеет одну и ту же структуру - объекты с двумя свойствами: "дата" и "название". Вы можете сравнить их с вложенными циклами. Например, что-то вроде этого может быть полезно...
updates.forEach(function(u) {
src.forEach(function(s) {
if (s.date === u.date && s.title === u.title) {
// You have a match
}
});
});
Я предполагаю, что вы хотите идентифицировать частичные совпадения, поэтому вы можете добавить/заменить if-условие во внутреннем цикле и соответствующим образом изменить массив src...
if (s.date === u.date && s.title !== u.title) {
// same date, different title, so...
// change the title of the current
// item from the 'src' array;
s.title = u.title;
}
Или используйте условия if-else-if по мере необходимости. Несмотря на это, хотя из вашего вопроса неясно, какой массив должен быть внешним циклом и который должен быть внутренним, вложенные циклы forEach выше сравнивают каждый элемент в массиве 'updates' с каждым элементом в 'src' массив.
Надеюсь, это помогло. :)
Как заметил Али, lodash _.isEqual
- хороший метод полезности для этого.
Проверьте https://lodash.com/docs/4.17.4#isEqual
Lodash действительно хорош для вспомогательных функций и работы с данными.
_.isEqual
он выполняет глубокое сравнение объектов.