Angular5 - 比较数组和 return 匹配项
Angular5 - Compare Arrays and return matches
我需要比较两个数组和 return 匹配项:
数组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)
当每个数组中的数字匹配时,我需要代码 returned。我已经能够用我展示的代码做到这一点,但我想知道是否有更简单的方法,比如使用过滤器或类似的东西?
是的,您可以使用单个 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"]
简而言之,这段代码遍历第一个数组,提取数字并检查它们是否存在于第二个数组中。
希望对您有所帮助!
需要注意的一件事是,根据数组的大小,您可能需要性能更高的算法。问题中提出的解决方案和@Mohammed Mortaga 提供的解决方案将为第一个数组中的每个元素循环遍历第二个数组(以大 O 表示法表示,即 O(n*m)
)。这比需要做的工作多得多。您实际上只需要遍历每个数组一次(在大 O 表示法中,即 O(n+m)
)。
您可以通过遍历 array1
创建一个查找 table,然后您可以使用它来查找 id 是否存在(并且很容易访问相应的代码):
const regex = /^([^:]*):(.*)/;
const lookup = array1.reduce((acc, val) => {
const [, id, code] = regex.exec(val);
acc[id] = code;
return acc;
}, {});
一旦您进行了查找 table,获取与您 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 符号仍然相同,但可读性是增加了)。
我需要比较两个数组和 return 匹配项:
数组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)
当每个数组中的数字匹配时,我需要代码 returned。我已经能够用我展示的代码做到这一点,但我想知道是否有更简单的方法,比如使用过滤器或类似的东西?
是的,您可以使用单个 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"]
简而言之,这段代码遍历第一个数组,提取数字并检查它们是否存在于第二个数组中。
希望对您有所帮助!
需要注意的一件事是,根据数组的大小,您可能需要性能更高的算法。问题中提出的解决方案和@Mohammed Mortaga 提供的解决方案将为第一个数组中的每个元素循环遍历第二个数组(以大 O 表示法表示,即 O(n*m)
)。这比需要做的工作多得多。您实际上只需要遍历每个数组一次(在大 O 表示法中,即 O(n+m)
)。
您可以通过遍历 array1
创建一个查找 table,然后您可以使用它来查找 id 是否存在(并且很容易访问相应的代码):
const regex = /^([^:]*):(.*)/;
const lookup = array1.reduce((acc, val) => {
const [, id, code] = regex.exec(val);
acc[id] = code;
return acc;
}, {});
一旦您进行了查找 table,获取与您 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 符号仍然相同,但可读性是增加了)。