#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>