在一个数组中查找元素,这个数组在另一个不等长的数组JavaScript中

时间:2018-01-18 01:58:36

标签: javascript for-loop

我来自Python学习JavaScript。在Python中,为了确定一个列表中的项是否在另一个列表中,我可以执行以下操作:

haystack = ['a', 'b', 'c', 'd', 'e', 'f']
needle = ['a', 'b', 'e']

[i for i in haystack if i in needle]

在JavaScript中,似乎列表的长度很重要,因为下面的代码返回ab而不是abe

var needle = ["a", "b", "e"]
var haystack  = ["a", "b", "c", "d", "e", "f"]

var found = "";
for (i=0; i < haystack.length; i++){
  for (j=0; j < needle.length;j++){
    if (needle[i] === haystack[j]) {
      found+=needle[j]
      }
    }
  }
console.log(found);

Python似乎并不关心列表是否具有不相等的长度,但JavaScript确实如此。我怎么能用JavaScript做到这一点?

4 个答案:

答案 0 :(得分:3)

你可以这样做

var needle = ["a", "b", "e"]
var haystack  = ["a", "b", "c", "d", "e", "f"]
var list = needle.filter(word => haystack.indexOf(word) >= 0);

在此解决方案中,您不必显式迭代数组的长度。它返回一组过滤后的单词。

其他选择

var list = needle.filter(word => haystack.includes(word));

IE中不支持第二个。

你做错了索引

if (needle[i] === haystack[j])

将是

if (needle[j] === haystack[i])

而且,不是将这些字符串添加到数组中,而是通过连接它们形成另一个字符串。

答案 1 :(得分:2)

你有完全正确的想法 - 问题是你的if语句是倒退的,所以它不会遍历haystack中的每个元素。

if (haystack[i] === needle[j]) {

答案 2 :(得分:1)

长度无关紧要,你遍历两个列表。你刚才犯了一点错误

if (needle[i] === haystack[j]) {
  found+=needle[j]
  }

由于您使用i并使用j进行针脚遍历haystack。当您使用haystack[j]代替haystack[i]时,您的if子句只会在干草堆上升至"c"它应该是:

if (needle[j] === haystack[i]) {
  found+=needle[j]
  }

答案 3 :(得分:0)

我会这样做:

&#13;
&#13;
function inArray(v, a){
  for(i=0,l=a.length; i<l; i++){
    if(a[i] === v){
      return true;
    }
  }
  return false;
}
function needlesInHaystack(needlesArray, haystackArray){
  for(var i=0,n,a=[],l=needlesArray.length; i<l; i++){
    n = needlesArray[i];
    if(inArray(n, haystackArray))a.push(n);
  }
  return a;
}
var needles = ['a', 'b', 'e', 'g'], haystack = ['a', 'b', 'c', 'd', 'e', 'f'];
console.log(needlesInHaystack(needles, haystack).join(''));
&#13;
&#13;
&#13;