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

Posted

技术标签:

【中文标题】Angular5 - 比较数组并返回匹配项【英文标题】:Angular5 - Compare Arrays and return matches 【发布时间】:2020-02-08 01:07:45 【问题描述】:

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

数组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)

当每个数组的数字匹配时,我需要返回代码。我已经能够使用我显示的代码来做到这一点,但我想知道是否有更简单的方法,比如使用过滤器或类似的东西?

【问题讨论】:

您是否要同时匹配"0:EQSOLREENVIO""10:EQADMIPDV" 以匹配"0" 中的"0" 元素? @DanielWSrimpel 不,每个数字都需要完全匹配 【参考方案1】:

需要注意的一点是,根据数组的大小,您可能需要一个性能更高的算法。问题中提出的解决方案和@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 我喜欢你的方法,但我无法理解它的作用: const [, id, code] = regex.exec(val);为什么id和code前面有逗号? @PLATANIUM 这是 javascript 中的新语法。它被称为解构。它可以从数组中提取值。 idcode 值是数组中的第二项和第三项。第一项可以跳过,因为我们不需要它,因此那里没有变量。 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…【参考方案2】:

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

简而言之,这段代码遍历第一个数组提取数字并检查它们是否存在于第二个数组中。

希望这会有所帮助!

【讨论】:

你能给我解释一下这部分吗? e.match(/\d+/) e 是您的循环正在运行的当前元素。 .match 根据给定的模式查找字符串的子集。 /\d+/ 是我们使用的正则表达式模式,它只是说“给我e 中一个或多个数字的第一个匹配项。不过,如果您从中提取数据的数组不是完全典型的,您应该小心按照您给我们的示例中的格式,您的应用可能会崩溃。

以上是关于Angular5 - 比较数组并返回匹配项的主要内容,如果未能解决你的问题,请参考以下文章

text 从项数组中搜索字符串值并返回匹配的数组项。

如何比较python中的两个列表并返回匹配项

php - 如何在关联数组的数组中搜索多个键/值对并返回匹配项?

如何使用比较多个数据框并使用熊猫返回匹配项

比较两个对象数组并在新数组中返回匹配值

如何映射两个数组并将匹配项作为按钮返回?