Angular5-比较数组并返回匹配项

时间:2019-10-10 14:36:04

标签: arrays angular5

我需要比较两个数组并返回匹配项:

Array1

(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)

Array2

(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 个答案:

答案 0 :(得分:2)

要注意的一件事是,根据阵列的大小,您可能希望有一个性能更高的算法。问题中提出的解决方案以及@Mohammed Mortaga提供的解决方案将循环遍历第二个数组,以解决第一个数组中的每个元素(采用大O表示,即O(n*m))。这比需要做的工作多得多。您确实只需要循环遍历每个数组一次(大O表示为O(n+m))。

您可以通过遍历array1来创建查找表,然后使用该查找表来查找ID是否存在(并且可以轻松访问相应的代码):

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]);

由于执行两个循环操作,所以单行代码的性能会稍差一些,但是如果数组的长度非常小(并且大的O表示法仍然相同,但可读性会提高),则该性能相对较小。

答案 1 :(得分:1)

是的,您可以像这样使用单个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"]

简而言之,这段代码在第一个数组上进行迭代,以提取数字并检查第二个数组中是否存在数字。

希望这会有所帮助!