Как найти разницу между двумя вложенными массивами и отслеживать, что обновляется, удаляется или добавляется - PullRequest
1 голос
/ 10 июля 2019

Редактировать Все еще пытаясь решить эту проблему, помощь очень ценится.Моя самая большая проблема - определить, какой тип или значение было обновлено , потому что мне нужно также получить сведения о соответствующем продукте.

У меня есть массив объектов с именем "oldList" со следующей структурой.

var oldList = [
  {
    productId: "1",
    productName: "Photo Frame",
    Quantity: "20",
    attributes: [
      {
        type: "frame",
        value: "black"
      },
      {
        type: "finish",
        value: "matte"
      }
    ]
  },
  {
    productId: "2",
    productName: "Photo Frame",
    Quantity: "50",
    attributes: [
      {
        type: "frame",
        value: "black"
      },
      {
        type: "finish",
        value: "glossy"
      }
    ]
  },
  {
    productId: "3",
    productName: "Photo Frame",
    Quantity: "10",
    attributes: [
      {
        type: "frame",
        value: "white"
      },
      {
        type: "finish",
        value: "matte"
      }
    ]
  },
  {
    productId: "4",
    productName: "Photo Frame",
    Quantity: "100",
    attributes: [
      {
        type: "frame",
        value: "white"
      },
      {
        type: "finish",
        value: "glossy"
      }
    ]
  },
  {
    productId: "5",
    productName: "Photo Frame",
    Quantity: "89",
    attributes: [
      {
        type: "frame",
        value: "wood"
      },
      {
        type: "finish",
        value: "matte"
      }
    ]
  },
  {
    productId: "6",
    productName: "Photo Frame",
    Quantity: "10",
    attributes: [
      {
        type: "frame",
        value: "wood"
      },
      {
        type: "finish",
        value: "glossy"
      }
    ]
  }
];

Далее у меня есть еще один список с именем "updatedList" со следующей структурой.В основном это обновленная копия массивов вложенных атрибутов.Например, в массиве атрибутов было 3 изменения:

  1. Пользователь заменил значение «черный» на «золото».Поскольку я знаю, что пользователь обновляет значение с «черного» до «золотого», другие свойства, такие как productId productName и количество, которые пользователь ранее вводил в старом списке, все равно должны быть сохранены, поскольку они просто меняют значениеиз массива атрибутов.

  2. Пользователь удалил значение «дерево»

  3. Пользователь добавил значение «серебро»

СейчасЯ хочу найти разницу между oldList и newList, чтобы отслеживать, что пользователь добавил, удалил или обновил.Например, это желаемый результат

 var mergeList = [
  {
    // Value is updated from black to gold
    productId: "1",
    productName: "Photo Frame",
    Quantity: "20",
    attributes: [
      {
        type: "frame",
        value: "gold"
      },
      {
        type: "finish",
        value: "matte"
      }
    ]
  },
  {
    // Value is updated from black to gold
    productId: "2",
    productName: "Photo Frame",
    Quantity: "50",
    attributes: [
      {
        type: "frame",
        value: "gold"
      },
      {
        type: "finish",
        value: "glossy"
      }
    ]
  },
  {
    // No changes
    productId: "3",
    productName: "Photo Frame",
    Quantity: "10",
    attributes: [
      {
        type: "frame",
        value: "white"
      },
      {
        type: "finish",
        value: "matte"
      }
    ]
  },
  {
    // No changes
    productId: "4",
    productName: "Photo Frame",
    Quantity: "100",
    attributes: [
      {
        type: "frame",
        value: "white"
      },
      {
        type: "finish",
        value: "glossy"
      }
    ]
  },
  {
   // Newly added. No product details such as productId, Quantity and etc
   // for the time being.
    attributes: [
      {
        type: "frame",
        value: "silver"
      },
      {
        type: "finish",
        value: "matte"
      }
    ]
  },
  {
   // Newly added. No product details such as productId, Quantity and etc
   // for the time being.
    attributes: [
      {
        type: "frame",
        value: "silver"
      },
      {
        type: "finish",
        value: "silver"
      }
    ]
  }
];

Это мой текущий код.Я действительно не знаю, как подойти к этой ситуации.К вашему сведению, метод разница с взят из библиотеки с именем lodash.

 // #1 Inspect and compare (oldlist) with newlist
    var difference1 = differencewith(
      oldList,
      newList,
      isequal
    );

    // #2 compare new list with old list
    var difference2 = differencewith(
      newList,
      oldList,
      isequal
    );
...