2016-01-30 61 views
0

我正在研究javascript-koans,這是AboutApplyingWhatWeHaveLearnt.js的第一個挑戰。目標是在功能上編寫代碼 - 給出一個必要的答案 - 去除沒有蘑菇和堅果的產品,將它們推到一個新的數組中,並獲得該數組的長度。這裏是我正在使用的數據集:在_.filter中使用_.every

products = [ 
    { name: "Sonoma", ingredients: ["artichoke", "sundried tomatoes", "mushrooms"], containsNuts: false }, 
    { name: "Pizza Primavera", ingredients: ["roma", "sundried tomatoes", "goats cheese", "rosemary"], containsNuts: false }, 
    { name: "South Of The Border", ingredients: ["black beans", "jalapenos", "mushrooms"], containsNuts: false }, 
    { name: "Blue Moon", ingredients: ["blue cheese", "garlic", "walnuts"], containsNuts: true }, 
    { name: "Taste Of Athens", ingredients: ["spinach", "kalamata olives", "sesame seeds"], containsNuts: true } 
]; 

,這裏是從挑戰指導:)

解決使用過濾器()&所有(/任何()

我堅持使用每個內部過濾器(推,長度等不是問題)。我可以在沒有堅果的情況下篩選出條目,並且使用每個(所有的別名),在每個產品的索引中搜索每個產品的配料陣列,如果陣列包含「蘑菇」,則返回true/false。但是,我想使用過濾器的每個內部,所以我不必使用循環。這是我想到的,但它沒有返回任何條目:

_.filter(products, function(product) { 
    if(_.every(product.ingredients, function(ingredient) {ingredient !== "mushrooms"})){ 
    return product; 
    } 
}) 

我試圖做甚至可能嗎?任何指導非常感謝。

回答

0

假設你想創建兩個版本刪除元素的數組,以及另一個刪除元素的數組,我們可以定義一個partition函數,該函數通常基於過濾器函數進行。見this answer

function partition(arr, filter) { 
    var fail = []; 

    var pass = arr.filter((e, i, a) => { 
    if (filter(e, i, a)) return true; 
    fail.push(e); 
    }); 

    return [pass, fail]; 
} 

對於過濾功能,您並不需要every。只是檢查成分的每個元素的列表中不包含的蘑菇,那containsNuts屬性設置爲false:

現在你可以做

partition(products, filter) 

它會返回一個數組,其第一個元素是一個數組(沒有蘑菇等的元素),第二個元素是失敗元素的數組。

0

你的問題是你沒有「返回」在_.every函數。

看起來這應該對片段做的伎倆您提供:

_.filter(products, function(product) { 
    return product.ingredients.indexOf('mushrooms') === -1; 
}); 

在整個問題方面,試試這個:

_.filter(products, function(product) { 
    return _.every(product.ingredients, function(ingredient) { 
    if (/nut|mushroom/.test(ingredient) { 
     altArray.push(ingredient); 
     return false; 
    } 
    return true; 
    }); 
}); 
+0

什麼是'altArray'在這裏做什麼? –

+0

對於這部分問題:「刪除沒有蘑菇和堅果的產品,將它們推向新陣列」 – tanenbring

+0

哈,我錯過了containsNuts部分數據。請參閱@ torazaburo的更好實施答案。 – tanenbring