为了在另一个数组中搜索一个数组的元素,可以在搜索目标上使用indexOf()并在其他数组元素上运行循环,并在每个步骤中检查是否存在。这是微不足道的,我对Javascript的了解也是如此。任何人都可以建议一个更有效的方法吗?也许甚至内置的语言方法可以帮助?虽然我无法使用谷歌这样的方法。
答案 0 :(得分:2)
您可以在内部使用 Array.filter() 并在Array的原型上实现一个函数,该函数返回两者共有的元素。
Array.prototype.common = function(a) {
return this.filter(function(i) {
return a.indexOf(i) >= 0;
});
};
alert([1,2,3,4,5].common([4,5,6])); // "4, 5"
再次如你在帖子中提到的那样,这个逻辑也可以通过获取每个元素并检查它是否存在于另一个元素中来工作。
答案 1 :(得分:1)
头发更有效的方法是将其中一个数组转换为哈希表,然后遍历第二个,在O(1)时检查元素的存在:
a = [1,2,3,4,5]
b = [1,7,3,8,5]
map = {}
a.forEach(function(x) { map[x] = 1 })
intersection = b.filter(function(x) { return map[x] === 1 })
document.write(JSON.stringify(intersection))
这仅适用于有问题的元素是基元的情况。对于对象数组,您必须使用indexOf
方法。
ES6(“Harmony”)确实支持Set
,但奇怪的是没有设置操作(并集,交集等),因此应该手动编码:
// Firefox only
a = [1,2,3,4,5]
b = [1,7,3,8,5]
sa = new Set(a)
sb = new Set(b)
sa.forEach(function(x) {
if (!sb.has(x))
sa.delete(x);
});
document.write(uneval([...sa]))
答案 2 :(得分:0)
JavaScript的数组没有一个可以进行交叉的方法。各种库提供了执行此操作的方法(通过按照您的描述循环数组),包括Underscore和PrototypeJS(以及其他人,我确定)。