Angular5 - Сравнение массивов и совпадений - PullRequest
0 голосов
/ 10 октября 2019

Мне нужно сравнить два массива и вернуть совпадения:

Массив1

(13) ["0:EQSOLREENVIO", "1:EQPER", "2:EQCAN", "3:EQRECHKODOC", "4:EQAUS,EQCDE,EQDDE,EQINACCE,EQVAC", "5:EQINDEV", "6:EQCAMBIODI,EQENV,EQFECHA,EQFIESTA,EQINCITRASP", "7:EQENT", "8:EQDEV", "9:EQRCH", "10:EQADMIPDV", "11:EQCRE,EQRETENER", "12:EQRECOOFI"]
0: "0:EQSOLREENVIO"
1: "1:EQPER"
2: "2:EQCAN"
3: "3:EQRECHKODOC"
4: "4:EQAUS,EQCDE,EQDDE,EQINACCE,EQVAC"
5: "5:EQINDEV"
6: "6:EQCAMBIODI,EQENV,EQFECHA,EQFIESTA,EQINCITRASP"
7: "7:EQENT"
8: "8:EQDEV"
9: "9:EQRCH"
10: "10:EQADMIPDV"
11: "11:EQCRE,EQRETENER"
12: "12:EQRECOOFI"
length: 13
__proto__: Array(0)

Массив2

(3) ["11", "0", "5"]
0: "11"
1: "0"
2: "5"
length: 3
__proto__: Array(0)

Что я пробовал:

    const orderStatusCodes = this.orderInProgressCmsModel.orderStatusCodes.split("/");
    const orderGroupsEditables = this.orderInProgressCmsModel.orderStatusLogEditables.split(",");
    let groupFound = '';
    const groupFound2 = [];

    orderGroupsEditables.forEach((element2) => {
      orderStatusCodes.forEach((element) => {
        if (element.indexOf(element2) >= 0){
          groupFound = element.split(":")[1];
          groupFound2.push(groupFound);
        }
      });
    });

Результат:

(4) ["EQCRE,EQRETENER", "EQSOLREENVIO", "EQADMIPDV", "EQINDEV"]
0: "EQCRE,EQRETENER"
1: "EQSOLREENVIO"
2: "EQADMIPDV"
3: "EQINDEV"
length: 4
__proto__: Array(0)

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

Ответы [ 2 ]

2 голосов
/ 11 октября 2019

Следует отметить, что в зависимости от размера массивов может потребоваться более производительный алгоритм. Решение, представленное в вопросе, и решение, предоставленное @Mohammed Mortaga, будет проходить через второй массив для каждого элемента в первом массиве (в большой записи O это будет O(n*m)). Это делает гораздо больше работы, чем необходимо. На самом деле вам нужно всего лишь проходить по каждому массиву по одному разу (в больших обозначениях O это будет O(n+m)).

Вы можете создать таблицу подстановки, просматривая array1, которую затем можете использовать дляпоиск, если идентификатор существует (и легко имеет доступ к соответствующему коду):

const regex = /^([^:]*):(.*)/;
const lookup = array1.reduce((acc, val) => {
  const [, id, code] = regex.exec(val);
  acc[id] = code;

  return acc;
}, {});

После того, как у вас есть таблица поиска, получение кода, соответствующего каждому элементу в вашем array2, становится постоянной сложностью. (то есть для каждого элемента, который нам не нужен для поиска совпадения, мы можем знать в постоянное время, есть ли совпадение или нет). Здесь вы можете использовать reduce:

const codes = array2.reduce((acc, id) => {
  const code = lookup[id];

  if (code) {
    acc.push(code);
  }

  return acc;
}, []);

или вы можете использовать однострочник:

const codes = array2.filter(id => lookup[id]).map(id => lookup[id]);

Однострочник будет немного менее производительным, потому что он делает два циклаопераций, но это относительно незначительно, если массив довольно мал по длине (и нотация с большим О будет такой же, но читаемость увеличится).

1 голос
/ 10 октября 2019

Да, вы можете достичь этого, используя одну функцию filter, например, так:

const array1 = ["0:EQSOLREENVIO", "1:EQPER", "2:EQCAN", "3:EQRECHKODOC", "4:EQAUS,EQCDE,EQDDE,EQINACCE,EQVAC", "5:EQINDEV", "6:EQCAMBIODI,EQENV,EQFECHA,EQFIESTA,EQINCITRASP", "7:EQENT", "8:EQDEV", "9:EQRCH", "10:EQADMIPDV", "11:EQCRE,EQRETENER", "12:EQRECOOFI"];

const array2 = ["11", "0", "5"];

const result = array1.filter(e => array2.indexOf(e.match(/\d+/)[0]) > -1); // ["0:EQSOLREENVIO", "5:EQINDEV", "11:EQCRE,EQRETENER"]

Короче говоря, этот код перебирает первый массив, извлекая цифры и проверяет, существуют ли они в или нетвторой массив.

Надеюсь, это поможет!

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