2015-02-11 91 views
0

我一直在解決一個問題,需要一些幫助!JavaScript函數無法按預期工作

我已經建立了我自己的每個以下功能:

var myArray = [1,2,3,4,5]; // this will be running through the collection parameter 

var each = function (collection, callback) { 
if (Array.isArray(collection)) { 
    for (i=0; i<collection.length; i++) { 
    callback(collection[i]); 
     }; 
} else { 
    for (var property in collection){ 
    callback(collection[property]); 
    } 
} 
}; 

我還創建了下面自己的過濾功能:

var filter = function(collection, predicate) { 
var newArray= []; 
    if (each(collection, predicate)) { 
    newArray.push(collection[property]); 
    }; 
return newArray; 
}; 


var test = function (item) { 
return item > 2; 
}; // this will be running through the predicate parameter 

filter(myArray, test); 

我試圖做的,在不改變每個功能或測試功能,只有過濾功能,都可以利用過濾功能中的每個功能。最後一行代碼將返回的是myArray的每個元素,最終在謂詞參數下是真實的 - 在這種情況下,是測試函數。所以結果應該是[3,4,5]。但是,我只是讓數組打印出空的。我知道那裏的錯誤在於 - 我相信它是在這裏:

if (each(collection, predicate)) 

這行代碼是試圖做的,是使用的各項功能,使用謂詞函數集合中的每個項目迭代,如果該特定item在謂詞下評估爲真,下面一行將元素推入newArray。

希望這是有道理的!

+0

不要忘記用'var'聲明你的局部變量! – Pointy 2015-02-11 02:27:07

回答

0

filter功能需要來包裝謂詞在一個單獨的功能,所以它可以建立它的返回值:

var filter = function(collection, predicate) { 
    var newArray= []; 
    each(collection, function(element) { 
    if (predicate(element)) newArray.push(element); 
    }); 
    return newArray; 
}; 

現在回調傳遞到您的each()函數使用傳入的測試函數來檢查集合中的每個元素,但是它可以使用該結果來確定元素是否應添加到結果中。

0

你會想要做這樣的事情:

var filter = function(collection, predicate) { 
    var array = []; 
    each(collection, function(item) { 
    if(predicate(item)) 
     array.push(item); 
    }); 
    return array; 
}; 

每個的第二個元素是回調

+0

OP不使用Underscore或Lodash。 – Pointy 2015-02-11 02:31:15

+0

@點哎呀,那下劃線是一個壞習慣,我把它拿出來了。 – 2015-02-11 02:41:29