Angular сравнить массив и обновить один из него - PullRequest
0 голосов
/ 03 мая 2020

У меня есть эти два набора массива, мне нужно сравнить их, и если объект из 2-го массива найден в 1-м массиве, мне нужно обновить статус в 1-м массиве до true. На angular как массировать данные, спасибо!

Ниже приведен образец массива,

arr1 = [
  {id: 1, status: false},
  {id: 2, status: false},
  {id: 3, status: false}
];

arr2 = [
  {id: 4},
  {id: 5},
  {id: 2}
];

1 Ответ

0 голосов
/ 03 мая 2020

Даже если вы не предоставили какой-либо (ошибочный) код от себя, я понимаю, что иногда бывает даже трудно начать с такой вещи.

В этом случае вам следует найти начальную точку. Вы можете использовать исходный массив (arr1) в качестве отправной точки или arr2. Если arr2 крошечный, это быстрее использовать в качестве отправной точки. Чем больше значение arr2, тем больше вы можете начать с arr1, поскольку это решение более читабельно (субъективно).

С arr2 в качестве отправной точки вы можете использовать метод forEach, в сочетании с find:

arr2.forEach((item) => {
  const target = arr1.find(({ id }) => item.id === id);

  if (target) {
    target.status = true;
  }
});

Используя arr1 в качестве отправной точки, вы можете использовать метод map. Это создаст новый массив на месте, что обычно хорошо, учитывая систему обнаружения изменений angular:

arr1 = arr1.map((item) => ({
  ...item,
  status: arr2.some(({ id }) => item.id === id)
});

Это также создаст новую ссылку на объект. В зависимости от вашего набора данных производительность может быть проблемой, но это будет заметно только при обработке +10 000 объектов (в зависимости от сложности ваших объектов).

Если вы не хотите status: true переписать в false на arr1, необходимо добавить дополнительное условие:

arr1 = arr1.map((item) => ({
  ...item,
  status: item.status || arr2.some(({ id }) => item.id === id)
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...