2016-01-30 3 views
0

Я работаю над javascript-koans, первым вызовом AboutApplyingWhatWeHaveLearnt.js. Цель состоит в том, чтобы написать код функционально - дается императивный ответ - который удаляет продукты, у которых нет грибов и орехов, подталкивает их к новому массиву и получает длину этого массива. Вот набор данных Я работаю с:Использование _.внутри внутри _.filter

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 } 
]; 

А вот руководство с вызовом:

решить с помощью фильтра() & все()/любой()

Я застрял на использовании каждого внутреннего фильтра (толчок, длина и т. Д. Не проблема). Я могу отфильтровать записи без орехов и, используя каждый (псевдоним all), искать массив ингредиентов каждого продукта с индексом каждого отдельного продукта, возвращая 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 свойства является ложным:

Теперь вы можете сделать

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

Смежные вопросы