2016-11-21 52 views
1

我認爲這種技巧叫做咖喱。錯誤屬性未定義傳遞匿名函數(如何咖喱)?

問題:

https://repl.it/E4iG

ReferenceError: type is not defined 
    at hasType:14:27 
    at allApprovalTypes.map:18:26 
    at eval:17:21 
    at eval 

問: 如何使用hasType所以最後我可以代替未命名的匿名功能approvals.find(hasType)

var approvals = [ 
     {type: 'media'}, 
     {type: 'scope'}, 
    ] 

    var allApprovalTypes = [ 
     'media', 
     'scope', 
     'finance', 
     'compliance', 
    ]; 

    var hasType = (el) => { 
     return el.type === type; 
    } 

    allApprovalTypes.map((type) => { 
     return approvals.find((el)=> el.type === type) || {type: type} // this works. 
    }); 

    allApprovalTypes.map((type) => { 
     return approvals.find(hasType) || {type: type} // this wont work.   
    }); 
+1

如何你'hasType'功能知道'type'變量? –

回答

2

hasType正在引用其範圍中不存在的「type」變量。您需要內聯函數爲其拿起型(或封閉包裹,但是這幾乎是同樣的事情)

allApprovalTypes.map((type) => { 
    return approvals.find((el) => { 
     return el.type === type; 
    }) || {type: type} 
}); 


    // closure 
    var hasType = (type) => (el) => { 
     return el.type === type; 
    } 

附: - 無關,但在ES6中,「{type:type}」可以縮寫爲「{type}」

+0

如何將它封裝在閉包中以使hasType有效?這封閉是我想要實現的。我只是有點失去語法明智。 –

+1

將hasType更改爲接受「type」的函數,但返回hasType函數的原始版本。然後,在你.find(...)通過hasType(類型): VAR hasType =(類型)=> { \t回報率(EL)=> { \t \t返回el.type ===類型; \t}; }; ... allApprovalTypes.map(type => { return approvals.find(hasType(type))|| {type}; }); –

+0

ayeee多數民衆贊成在我正在尋找。這種技術被稱爲咖啡正確? –

0

您可以通過使用.bind()。您可以將type(額外的參數)傳遞給回調函數。

var approvals = [ 
 
     {type: 'media'}, 
 
     {type: 'scope'}, 
 
    ] 
 

 
    var allApprovalTypes = [ 
 
     'media', 
 
     'scope', 
 
     'finance', 
 
     'compliance', 
 
    ]; 
 

 
    var hasType = (el, type) => { 
 
     return el.type === type; 
 
    } 
 

 
    console.log(allApprovalTypes.map((type) => { 
 
     return approvals.find(hasType.bind(null, type)) || {type: type} // this works. 
 
    })); 
 

 
    
 

 
    //without bind(); 
 
    console.log(allApprovalTypes.map((type) => { 
 
     return approvals.find((el) => return hasType(el, type)) || {type: type} // this works. 
 
    }));

+0

下面的答案說封閉中的包裝。任何想法如何使用綁定來實現這個W/O? –

+0

沒有綁定意味着在你的'匿名函數'(胖箭頭函數)中調用'hasType()'。我更新了這個 –

+1

我正在尋找 var hasType =(type)=>(el)=> el.type === type; –

相關問題