我来自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做到这一点?
答案 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)
我会这样做:
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;