Как получить изменения между 2 массивами объектов? [lodash / JS]

#javascript #arrays #object #lodash

#javascript #массивы #объект #lodash

Вопрос:

У меня есть таблица, уже заполненная dataset из API. Для демонстрации просто скажем, что у меня есть 2 уже добавленные строки в таблице, которые я извлек из API. Теперь я отредактировал вторую строку и добавил еще одну строку. Итак, чего я хочу добиться, так это того, что я хочу получить новый массив объектов, в котором есть строка, которую я только что отредактировал, вместе со строкой, которую я только что добавил.

Ниже приведены 2 массива с фиктивным набором данных, которые у меня есть.

Первый массив:

 [
  { id: '38sj3-23', user: { id: 21323 }, count: { start: 12, end: 24 }, point: 56 },
  { id: '38sj3-23', user: { id: 21323 }, count: { start: 8, end: 36 }, point: 49 },
]
 

Второй массив:

 [
  { id: '38sj3-23', user: { id: 21323 }, count: { start: 12, end: 24 }, point: 56 },
  { id: '38sj3-23', user: { id: 21323 }, count: { start: 36, end: 97 }, point: 15 },
  { id: null, count: { start: 123, end: 2135 }, point: 323 },
]
 

Обратите внимание, что я отредактировал значения 2-й строки в Second Array . Третья строка во 2-м массиве не имеет идентификатора пользователя, потому userId что воля возвращается с сервера после его публикации

Ожидаемый результат:

 [
  { id: '38sj3-23', user: { id: 21323 }, count: { start: 36, end: 97 }, point: 15 },
  { id: null, count: { start: 123, end: 2135 }, point: 323 },
]
 

Я пытался lodash _.differencWith / _.intersectWith но результат, использующий это, был таким, как показано ниже

 [
  { id: null, count: { start: 123, end: 2135 }, point: 323 },
]
 

Только что была возвращена недавно добавленная строка в таблице, но игнорировалось, что я также изменил значения во 2-й строке.

ПРИМЕЧАНИЕ: в таблице всего 3 столбца, все они доступны для редактирования. coun: { start, end} и point

Комментарии:

1. вы пробовали: _.differenceWith(x, y, _.isEqual) ? где x, y — 2 массива

2. @Mani Да _.differenceWith(second, first, _.isEqual) . Я попробовал это так.

3. Я получаю ожидаемый результат от этой функции, можете ли вы проверить решение и запустить из этого решения.

Ответ №1:

Вы можете использовать _.differenceWith (https://lodash.com/docs/4.17.15#differenceWith )

 const first=[
  { id: '38sj3-23', user: { id: 21323 }, count: { start: 12, end: 24 }, point: 56 },
  { id: '38sj3-23', user: { id: 21323 }, count: { start: 8, end: 36 }, point: 49 },
]

const second=[
  { id: '38sj3-23', user: { id: 21323 }, count: { start: 12, end: 24 }, point: 56 },
  { id: '38sj3-23', user: { id: 21323 }, count: { start: 36, end: 97 }, point: 15 },
  { id: null, count: { start: 123, end: 2135 }, point: 323 },
]

let result=_.differenceWith(second, first, _.isEqual)

console.log(result) 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js"></script> 

_.differenceWith :

Этот метод похож _.difference , за исключением того, что он принимает компаратор, который вызывается для сравнения элементов массива со значениями. Порядок и ссылки на результирующие значения определяются первым массивом. Компаратор вызывается с двумя аргументами: (arrVal, othVal) .

Комментарии:

1. Кажется, это работает, но в моем проекте это не так. Не могли бы вы, пожалуйста, проверить фрагмент кода, который я добавил по ссылке ниже. Кажется, он возвращает только недавно добавленную строку goonlinetools.com/snapshot/code/#iu37oyqaa7mbci0d8zipiv

2. ibb.co/6JMpzDh <— проверьте это изображение.. это результат, который я получаю

3. Извините. возможно, я допустил ошибку… Пожалуйста, позвольте мне еще раз проверить правильно.. Приносим извинения за доставленные неудобства

4. Хорошо, не стесняйтесь поделиться, если вы застряли в какой-то момент

5. Я нашел проблему. Я выполнял операцию Lodash правильно, но проблема заключалась в том, что я firstArray обновлялся, когда менял secondArray из-за той же ссылки. Теперь я использовал _.cloneDeep lodash, затем сравнил и теперь он работает… Спасибо вам за ваше время и усилия, я смог осознать свою ошибку..

Ответ №2:

 const a = [
  { id: '38sj3-23', user: { id: 21323 }, count: { start: 12, end: 24 }, point: 56 },
  { id: '38sj3-23', user: { id: 21323 }, count: { start: 8, end: 36 }, point: 49 },
]

const b = [
  { id: '38sj3-23', user: { id: 21323 }, count: { start: 12, end: 24 }, point: 56 },
  { id: '38sj3-23', user: { id: 21323 }, count: { start: 36, end: 97 }, point: 15 },
  { id: null, count: { start: 123, end: 2135 }, point: 323 },
];

result = _.differenceWith(b, a, _.isEqual)
console.log(result); // your excpected result. 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js"></script>