Как мы можем сравнить более двух или нескольких массивов в Typescript, Angular? - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть 4 массива, в которых я должен проверить, есть ли какой-либо элемент в более чем 2 массивах. если это так, то на основе свойства, которое я должен удалить из всех остальных, кроме одного.

let arrayA = [{id: 1, modifiedOn: 1234}, {id: 2, modifiedOn: 1234}, {id: 3, modifiedOn: 1234}]

let arrayB = [{id: 4, modifiedOn: 1234}, **{id: 2, modifiedOn: 1235}**, {id: 5, modifiedOn: 1234}]

let arrayC = [{id: 6, modifiedOn: 1234}, {id: 7, modifiedOn: 1234},
**{id: 5, modifiedOn: 1235}**]

let arrayD = [**{id: 1, modifiedOn: 1235}**, {id: 8, modifiedOn: 1234}, {id: 9, modifiedOn: 1234}]

Как вы можете видеть выше, id 2, id 5 и id 1 в более чем 1 массиве, который когда-либо элементов ifiedOn больше, он должен оставаться, а другие должны быть удалены.

1 Ответ

0 голосов
/ 17 апреля 2020

https://codepen.io/vitkarpov/pen/GRpZzqx

function buildSearchIndex(arrays) {
  const index = {};

  for (let i = 0; i < arrays.length; i++) {
    for (let j = 0; j < arrays[i].length; j++) {
      const {id, modifiedOn} = arrays[i][j];
      index[id] = index[id] || {};
      index[id][modifiedOn] = [arrays[i], j];
    }
  }
  return index;
}

function removeDuplicates(...arrays) {
  const searchIndex = buildSearchIndex(arrays);

  Object.keys(searchIndex).forEach((id) => {
    const index = searchIndex[id];
    const modifiedOnRecords = Object.keys(index);

    // skip first, it corresponds to the value with the smallest modifiedOn value
    for (let i = 1; i < modifiedOnRecords.length; i++) {
      const modifiedOn = modifiedOnRecords[i];
      const [arr, j] = index[modifiedOn];
      arr.splice(j, 1);
    }
  });
}

let arrayA = [{id: 1, modifiedOn: 1234}, {id: 2, modifiedOn: 1234}, {id: 3, modifiedOn: 1234}]
let arrayB = [{id: 4, modifiedOn: 1234}, {id: 2, modifiedOn: 1235}, {id: 5, modifiedOn: 1234}]
let arrayC = [{id: 6, modifiedOn: 1234}, {id: 7, modifiedOn: 1234}, {id: 5, modifiedOn: 1235}]
let arrayD = [{id: 1, modifiedOn: 1235}, {id: 8, modifiedOn: 1234}, {id: 9, modifiedOn: 1234}]

removeDuplicates(arrayA, arrayB, arrayC, arrayD);

Мне очень понравилась эта проблема. Выглядит как хороший кандидат на собеседование на доске, на самом деле: -)

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