我有两个数组。一个像first = ['a','b','c']
,另一个像second = ['acd','abd', 'gfa', 'kqb']
。我想做的是一个函数,返回第二个数组中的元素,其中第一个数组中的元素一起出现。
例如,该函数将返回'acd','abd‘,因为这是第二个数组中唯一的元素,第一个数组中的元素一起出现。我需要它在javascript/typescript中。
发布于 2018-07-26 22:19:26
这段代码完成了您所需的工作:
first = ['a','b','c'];
second = ['acd','abd', 'gfa', 'kqb'];
function findOccurencies(first, second) {
const result = [];
second.forEach(target => {
let count = 0;
first.forEach(source => {
count += target.indexOf(source) >= 0 ? 1 : 0;
});
if (count >= 2) {
result.push(target);
}
});
return result;
}
console.log(findOccurencies(first, second));
发布于 2018-07-26 22:27:52
(请务必查看如何改进您在评论中提到的问题。但由于有人已经在这里发布了代码,而且我更喜欢我的解决方案,所以这里就是我的解决方案。)
以下是一种方法:
const foo = (arr1, arr2) => arr2.filter(str => arr1.reduce(
(count, char) => count + (str.includes(char) ? 1 : 0),
0
) > 1)
const result = foo(['a', 'b', 'c'], ['abc', 'abd', 'gfa', 'kqb'])
console.log(result)
这里可能存在一个效率低下的问题,因为即使在通过两个匹配之后,它也会继续循环第一个数组。如果它被证明是一个问题,这将在一定程度上缓解这一问题:
(count, char) => count > 1 ? count : count + (str.includes(char) ? 1 : 0),
这仍然会循环,但一旦达到阈值,就不再执行开销很大的includes
调用。如果您希望完全停止循环,则可能必须使用更强制的方法,例如for
-loop。
发布于 2018-07-26 22:33:18
我可能会这样做:
const first = ['a','b','c'];
const second = ['acd','abd', 'gfa', 'kqb'];
const result = second.filter(
word => first.filter(char => word.includes(char)).length > 1
);
console.log(result);
https://stackoverflow.com/questions/51540817
复制相似问题