2016-11-16 53 views
0

我試圖寫的濾波器函數,接受2個參數: ID類型和實際的ID。使用這些ID,我想過濾一個對象數組。

例如,在這裏我試圖獲得一個只包含名稱爲'Mike'的值的新數組。array.filter通過對象屬性,參數不限定

對象:

var sample = [ 
{ name: 'Mike'}, 
{ name: 'John'} 
]; 

濾波器功能:

function filterById(obj, parameter, id) { 
    return obj.parameter == id; 
} 

此:未定義

console.log(sample.filter(filterById(name, 'Mike'))); 

返回名稱。

我是否需要傳遞實際的數組呢?是否有可能將參數傳遞給濾波函數?

回答

5

您將需要通過「參數」作爲一個字符串太,並使用方括號,而這一切工作的filterById功能會本身必須返回其通過Array.prototype.filter使用的功能相匹配的功能:

var sample = [ 
 
    { name: 'Mike'}, 
 
    { name: 'John'} 
 
]; 
 

 
function filterById(parameter, id) { 
 
    return function(obj){ 
 
    return obj[parameter] == id; 
 
    } 
 
} 
 

 
console.log(sample.filter(filterById('name', 'Mike')));

1

你不必自己調用該函數的 - 這是一個high-order function,所以你必須提供的唯一功能。在這裏,我們來解決這個問題 - 你想在那裏傳遞論據,但你不能!

所以,有幾種方法。第一個是剛剛返回另一個函數,該函數將數據保存在封閉:

function filterById(parameter, id) { 
    return function(item) { 
     return item[parameter] == id; 
    } 
} 

第二個選項是創建通過.bind另一個函數,這是接近的partial application的想法。它將創建具有預定義參數的新功能。他們總是第一,所以你要實際的項目定義移動到最後的位置:

function filterById(parameter, id, item) { 
    return item[parameter] === id; 
} 

// we can create function for the future reference: 
const filterByMike = filterById.bind(null, 'name', 'Mike'); 

sample.filter(filterByMike); 

很難說什麼是好,但我個人更喜歡第二種方法。