2014-09-24 82 views
0

为了在另一个数组中搜索一个数组的元素,可以在搜索目标上使用indexOf(),并在其他数组元素上运行循环,并在每个步骤检查存在。这是微不足道的,而且我对Javascript的知识也是如此。任何人都可以请建议一个更有效的方法吗?也许甚至可以使用该语言的内置方法?虽然我无法使用谷歌这样的方法。javascript检查是否存在另一个数组中的1个数组

+0

'indexOf'是可能是你需要的高效,但也有一些其他方法提到http://stackoverflow.com/questions/1885557/simplest-code-for-array-intersection-in-javascript和可能在http://stackoverflow.com/questions/11076067 /在-javascript-arrays-finding-matches-between- – Rhumborl 2014-09-24 07:58:21

+0

你必须使用'i ndexOf'或一个可靠的跨浏览器解决方案的循环。在像jQuery这样的框架中有可用的方法(例如'inArray'),但也可以使用相同的方法。 – Diode 2014-09-24 08:01:56

回答

0

JavaScript的数组没有交叉点的方法。各种库提供了方法来做到这一点(通过循环你所描述的阵列),包括UnderscorePrototypeJS(以及其他人,我敢肯定)。

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"

再次为您在您的文章提到,这种的逻辑也适用,抓住每一个元素并检查它是否存在于其他。

+0

这真的很漂亮。 – 2014-09-24 08:35:47

+0

@ T.J.Crowder:谢谢兄弟:) – mithunsatheesh 2014-09-24 08:40:17

1

的毛发更有效的方法是转换阵列中的一个为哈希表,然后循环通过第二个,检查元件的在澳存在(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( “和谐号”)不支持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]))

相关问题