Сравнение двух массивов с Array.filter и переход на новые массивы на основе общих значений - PullRequest
0 голосов
/ 24 января 2020

Я пытаюсь использовать array.filter() для сравнения двух массивов и выделения значений, которые имеют эти два массива, основанных на определенном свойстве (id), и значений, которые они не имеют общего. Общие идентификаторы, которые я хочу записать в новый массив (recordsToUpdate). И я хочу добавить sh оставшиеся элементы из arr2 в новый массив (recordsToInsert).

То, что я пробовал, не работает. Как я могу переработать это, чтобы получить результаты, которые я хотел? - (который в данном примере должен быть одним массивом из 1 общего элемента {id: 3}, а другой массив из оставшихся элементов из arr2):

const arr1 = [{id: 1}, {id: 2}, {id: 3}];
const arr2 = [{id: 3}, {id: 4}, {id: 5}];

let recordsToUpdate = [];
let recordsToInsert = [];

recordsToUpdate = arr1.filter(e => (arr1.id === arr2.id));
recordsToInsert = ?

console.log('recordsToUpdate: ', recordsToUpdate);
console.log('recordsToInsert: ', recordsToInsert);

Желаемый результат должен быть:

recordsToUpdate = [{id: 3}];
recordsToInsert = [{id: 4}, {id: 5}];

Ответы [ 3 ]

2 голосов
/ 24 января 2020

Обновление сообщения Робина с использованием some вместо find. Это просто наоборот.

const arr1 = [{id: 1}, {id: 2}, {id: 3}];
const arr2 = [{id: 3}, {id: 4}, {id: 5}];

const recordsToUpdate = arr1.filter(e => arr2.some(obj => obj.id === e.id));
const recordsToInsert = arr2.filter(e => !arr1.some(obj => obj.id === e.id));

console.log('recordsToUpdate: ', recordsToUpdate);
console.log('recordsToInsert: ', recordsToInsert);
2 голосов
/ 24 января 2020

Попробуйте, используя Array.prototype.find , чтобы проверить, существует ли объект в arr2 с заданным id:

const arr1 = [{id: 1}, {id: 2}, {id: 3}];
const arr2 = [{id: 3}, {id: 4}, {id: 5}];

const recordsToUpdate = arr1.filter(e => arr2.find(obj => obj.id === e.id) !== undefined);
const recordsToInsert = arr1.filter(e => arr2.find(obj => obj.id === e.id) === undefined);

console.log('recordsToUpdate: ', recordsToUpdate);
console.log('recordsToInsert: ', recordsToInsert);
0 голосов
/ 24 января 2020

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

const arr1 = [
  { id: 1, v: "a" },
  { id: 2, v: "b" },
  { id: 3, v: "old" }
];
const arr2 = [
  { id: 3, v: "new" },
  { id: 4, v: "e" },
  { id: 5, v: "f" }
];

function updateRecords(currentArray, updatesArray) {
  const currentIds = currentArray.map(item => item.id);

  updatesArray.forEach(updateItem =>
    currentIds.includes(updateItem.id)
      ? (currentArray[
          currentIds.findIndex(id => id === updateItem.id)
        ] = updateItem)
      : currentArray.push(updateItem)
  );

  return currentArray;
}

console.log(updateRecords(arr1, arr2))

Это теперь дает вариант ниже:

[
  {
    "id": 1,
    "v": "a"
  },
  {
    "id": 2,
    "v": "b"
  },
  {
    "id": 3,
    "v": "new"
  },
  {
    "id": 4,
    "v": "e"
  },
  {
    "id": 5,
    "v": "f"
  }
]

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...