Как найти изменения между двумя массивами объектов (src и update) и применить изменения к массиву src?

1

У меня два массива src и update. Оба содержат объекты. Входящий JSON из API, объекты в массивах следуют той же структуре (см. Ниже).

Я хочу сравнить src с update и добавить/удалить/обновить элементы в src, которые представили изменения в update.

Мой текущий процесс включает в себя итерацию массивов и сравнение элементов с помощью JSON.stringify(), выполнение нескольких проходов. Передайте один, чтобы добавить, передать два, чтобы удалить, и передать три для обнаружения изменений для замены (я заменяю весь объект, а не поля).

Есть ли более простой/лучший способ?

Есть ли общая утилита, которая поможет вам в этом, или я должен написать свою собственную систему обнаружения diff?

EDIT: объекты внутри массивов выглядят как (но не ограничиваясь ими):

[
    {
        id: String,
        summary: String,
        updates: [
            {
                date: String,
                title: String
            },
            { Repeated }
        ]
    },
    { Repeated }
]
  • 2
    Я обычно использую lodash _.isEqual он выполняет глубокое сравнение объектов.
Теги:

2 ответа

1

Если я правильно понимаю ваш вопрос, ваш массив "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' массив.

Надеюсь, это помогло. :)

  • 0
    Спасибо за ответ. Да, это правильно. По сути, мне нужно иметь уникальный процесс для объединения пакетов данных, основанных на самих данных?
  • 0
    @DavidAlsh Демонстрация показывает, как вы можете работать с двумя массивами с одинаковой структурой данных, но если вы имеете дело с массивами внутри массивов ... внутри массивов ... вы можете продолжить принцип доступа и сравнения данных с циклами внутри циклов ... внутри петли ... и вниз в глубину по мере необходимости. ;) И вы всегда можете передать совпадения специальным функциям, чтобы выполнить фактическую обработку, просто чтобы сохранить порядок и рефакторинг и т. Д.
1

Как заметил Али, lodash _.isEqual - хороший метод полезности для этого.

Проверьте https://lodash.com/docs/4.17.4#isEqual

Lodash действительно хорош для вспомогательных функций и работы с данными.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню