我需要比较两个数组并返回匹配项:
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)
当每个数组中的数字匹配时,我需要返回代码。我已经可以使用显示的代码来做到这一点,但是我想知道是否有更简单的方法,例如使用过滤器或类似方法?
答案 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"]
简而言之,这段代码在第一个数组上进行迭代,以提取数字并检查第二个数组中是否存在数字。
希望这会有所帮助!