2015-12-22 64 views
3

這似乎對我來說是正確的,但它不工作:的JavaScript Array.filter工作不正常

var arr = [1, 2, 3, 4, 5]; 

var bar = [2, 4]; 

arr = arr.filter(function(v) { 
    for (var i; i < bar.length; i++) { 
    return bar.indexOf(v); 
    } 
}); 

console.log(arr); // [] 

// expected: [1, 3, 5] 

這將如何工作,如何做地圖同樣的工作?

+1

你在哪裏使用'我'? – Rayon

+0

臉掌....... – elkebirmed

回答

9

Array#filter疊代陣列,你不需要forfilter

forfilter的問題是,它會返回元素的索引,這可能是-1truthy)如果不是發現和任何數組的長度。並且僅對於第一個元素(即索引零),filter不會將元素添加爲JavaScript中的零。

此外,for循環將僅檢查barreturn的第一個元素。

var arr = [1, 2, 3, 4, 5]; 
 
var bar = [2, 4]; 
 

 
arr = arr.filter(function(v) { 
 
    return bar.indexOf(v) === -1; 
 
}); 
 

 
console.log(arr); 
 
document.write('<pre>' + JSON.stringify(arr, 0, 4) + '</pre>');


你不需要Array#mapmap將改變數組元素與保持相同數量的元素。

+2

同意回答。要回答過濾器和映射的問題,如果函數中的返回值爲true,則過濾器僅返回那些元素。 Map返回相同數量的元素,對於返回false值,返回的元素將是未定義的。 還有一件事,地圖返回一個新的數組。過濾器不返回一個新的數組。 – Will

+0

@Tushar你可以給我同樣結果的地圖例子,只是爲了展示嗎? – elkebirmed

+1

如果使用'map'而不是'filter',則需要在地圖之後使用'filter'來刪除洞[** Demo **](https://jsfiddle.net/tusharj/6ouf9zda/)@elkebirmed – Tushar