2017-01-19 23 views
0

私がしようとしているのは、ストアのリストをフィルタリングし、grapefruitStoresという新しい変数オブジェクトに格納し、JavaScriptでコンソールに出力することです。私はフィルタ、マップ、および縮小を使用することが許可されています。ここでは、私がこれまで持っているものだ:Maceysはグレープフルーツを販売しており、ケントにはないので、JavaScript:フィルタ配列要素/オブジェクト

const stores = [{ 
    name: "Kents", 
    foods: [ 
     {name: 'bagels', type: 'grain'}, 
     {name: 'bread', type: 'grain'}, 
     {name: 'cereal', type: 'grain'}, 
     {name: 'milk', type: 'dairy'}, 
    ] 
    },{ 
    name: "Maceys", 
    foods: [ 
     {name: 'bagels', type: 'grain'}, 
     {name: 'bread', type: 'grain'}, 
     {name: 'cereal', type: 'grain'}, 
     {name: 'grapefruit', type: 'fruit'}, 
     {name: 'milk', type: 'dairy'}, 
    ] 
}]; 

//Filtering code 

function sellsGrapefruit(stores) { 
    return stores.foods.name === 'grapefruit'; //Don't think this is correct. 
} 

var grapefruitStores = store.filter(sellsGrapefruit); 

console.log(grapefruitStores); 

だから、唯一Maceysオブジェクト情報がコンソールに印刷する必要があります。空の配列/オブジェクトはスクリーンに印刷し続けますが、私はその理由をよく分かりません。私はここで間違って何をしていますか?どんな助けもありがとう。

+0

'foods'が...配列がNAME''プロパティを持つことができない一つ一つの配列で記録します。 「食品」の配列を繰り返す必要がある – charlietfl

+0

ええ、私は考えました。どうすればいい? –

+0

フィルタがそれらのフィルタを繰り返し処理します。 –

答えて

0

これはfilterメソッドではかなり簡単です。これは、渡された関数のブーリアン戻り値に応じて、配列の要素を含みます。あなたはあなたが投稿したものとほぼ同じですが、食品はオブジェクトの配列であり、それぞれが名前のプロパティを持ち、現在店舗の(存在しない)名前プロパティを呼び出しています。

したがって、この例のために、作業の繰り返しで、作業溶液は次のようになります。

var grapefruitStores = stores.filter(function(store) { 
    for (var i = 0; i < store.foods.length; i++) { 
     if (store.foods[i].name === 'grapefruit') { 
      return true; 
     } 
    } 
}); 
+0

フィルターを再び使用できるときに、フィルターの内側のフィルターを使用しているのはなぜですか?編集、ああ早く終了してください。私はそれが有効だと思いますが、恐らくフィルタ/マップ/ reduceを学ぶ点以外に –

+0

私は再びフィルタを使いたくないので、なぜ私はどちらかを使うべきだとは思っていません。もしあれば、forループはより高速です。 – furkle

+0

ありがとう、@ふくらはぎ! –

0

あなたのフィルタロジックを持つ小さな欠陥があります。あなたのアルゴリズムはstores配列のfoods属性をチェックしています。 stores配列内の各要素のfoods属性をチェックする必要があります。これを試してみてください:ここで

//Filtering code 
function sellsGrapefruit(store) { 
    for (var i in store.foods) { 
    var food = store.foods[i]; 
    if (food.name === 'grapefruit') 
     return true; 
    } 
    return false; 
} 

は実施例である:

jsFiddle:https://jsfiddle.net/mspinks/8vzfc8uL/3/

+0

これは完全に動作します。@Matt Spinks!ありがとうございました! –

+0

問題ありません!どういたしまして。 –

4

あなたはArray.some()を使用することができます。

function sellsGrapefruit(store) { 
    return store.foods.some(function(food) { 
     return food.name === 'grapefruit'; 
    }); 
}; 

var grapefruitStores = stores.filter(sellsGrapefruit); 
+0

この場合、私は彼らが許可されているとは思わない。 "filter、map、およびreduceを使用できます。" –

+0

ありがとう、@ワシントンGuedes! –

+0

私はあなたの答えが好きです。私はArray.some()関数を認識していませんでした。 –

0

フーズアレイは、店舗配列内のオブジェクトにネストされていますので、あなたが望む結果を得るためには、filterを2回使用する必要があります:

const stores = [{ 
    name: "Kents", 
    foods: [ 
     {name: 'bagels', type: 'grain'}, 
     {name: 'bread', type: 'grain'}, 
     {name: 'cereal', type: 'grain'}, 
     {name: 'milk', type: 'dairy'} 
    ] 
    },{ 
    name: "Maceys", 
    foods: [ 
     {name: 'bagels', type: 'grain'}, 
     {name: 'bread', type: 'grain'}, 
     {name: 'cereal', type: 'grain'}, 
     {name: 'grapefruit', type: 'fruit'}, 
     {name: 'milk', type: 'dairy'} 
    ] 
}]; 

function sellsGrapefruit(store) { 
    var x = store.foods.filter(function(i) { 
     return i.name === 'grapefruit'; 
    }); 
    return x.length > 0; 
} 

var grapefruitStores = stores.filter(sellsGrapefruit); // typo error: store -> stores 

console.log(grapefruitStores[0]); 
0

mapreducefilterのみを使用できます。私はこのアプローチを取った。

var grapeStores = stores.filter(function (store) { 
    return store.foods.filter(function (food) { 
    return food.name === 'grapefruit'; 
    }).length; 
}); 

console.log('grapeStores', grapeStores); 

それは

grapeStores [ { name: 'Maceys', 
    foods: [ [Object], [Object], [Object], [Object], [Object] ] } ] 
関連する問題