2017-08-06 6 views
1

私はオブジェクトの配列にreduceメソッドを使用しようとしています。各オブジェクトは人間であり、好きなアイスクリームの味です。目標は、この配列をプロパティとしてのフレーバとフレーバが値としてリストされた合計回数を含む単一のオブジェクトに減らすことです。オブジェクトの配列に対してreduceメソッドを使用して、それぞれに合計値を持つ単一オブジェクトを作成する方法は?

データ:

const data = [ 
    { name: 'Tyler', favoriteIceCreams: ['Strawberry', 'Vanilla', 'Chocolate', 'Cookies & Cream'] }, 
    { name: 'Richard', favoriteIceCreams: ['Cookies & Cream', 'Mint Chocolate Chip', 'Chocolate', 'Vanilla'] }, 
    { name: 'Amanda', favoriteIceCreams: ['Chocolate', 'Rocky Road', 'Pistachio', 'Banana'] }, 
    { name: 'Andrew', favoriteIceCreams: ['Vanilla', 'Chocolate', 'Mint Chocolate Chip'] }, 
    { name: 'David', favoriteIceCreams: ['Vanilla', 'French Vanilla', 'Vanilla Bean', 'Strawberry'] }, 
    { name: 'Karl', favoriteIceCreams: ['Strawberry', 'Chocolate', 'Mint Chocolate Chip'] } 
]; 

これは私がこれまで持っているものですが、私は正直にそれを行う方法について確認していません。

let iceCreamTotals = { 
     Strawberry: 0, 
     Vanilla: 0, 
     Chocolate: 0, 
     CookiesCream: 0, 
     MintChocolateChip: 0, 
     RockyRoad: 0, 
     Pistachio: 0, 
     Banana: 0, 
     FrenchVanilla: 0, 
     VanillaBean: 0 
    } 

    data.reduce((total, current) => { 

     return iceCreamTotals 
    }, 0) 

答えて

1

あなたは香りの名前と数を収集することができます。次の例は、データ内のフレーバーであるプロパティを持つオブジェクトを作成し、発生回数をカウントします。

var data = [ 
 
    { name: 'Tyler', favoriteIceCreams: ['Strawberry', 'Vanilla', 'Chocolate', 'Cookies & Cream'] }, 
 
    { name: 'Richard', favoriteIceCreams: ['Cookies & Cream', 'Mint Chocolate Chip', 'Chocolate', 'Vanilla'] }, 
 
    { name: 'Amanda', favoriteIceCreams: ['Chocolate', 'Rocky Road', 'Pistachio', 'Banana'] }, 
 
    { name: 'Andrew', favoriteIceCreams: ['Vanilla', 'Chocolate', 'Mint Chocolate Chip'] }, 
 
    { name: 'David', favoriteIceCreams: ['Vanilla', 'French Vanilla', 'Vanilla Bean', 'Strawberry'] }, 
 
    { name: 'Karl', favoriteIceCreams: ['Strawberry', 'Chocolate', 'Mint Chocolate Chip'] } 
 
]; 
 
    
 
var flavours = data.reduce(function(acc, obj) { 
 
    // for each flavour, add it to the accumulator if it's not already there 
 
    // and increament its count 
 
    obj.favoriteIceCreams.forEach(function(flavour) { 
 
    if (!acc[flavour]) { 
 
     acc[flavour] = 0; 
 
    } 
 
    ++acc[flavour]; 
 
    }); 
 
    return acc; 
 
}, Object.create(null)); 
 
    
 
console.log(flavours);

3

​​ので、アキュムレータ(任意reduce第2引数は、)オブジェクトであるべきです。次に、各ステップで、配列内の各要素の対応プロパティをカウントします(c.favoriteIceCreams.forEach)。 p[cream] = (p[cream] || 0) + 1;は、 "それ以外の場合は0 + 1に設定されている場合は1を加える"という構文の砂糖です。あなたが行くように

const data = [ 
 
    { name: 'Tyler', favoriteIceCreams: ['Strawberry', 'Vanilla', 'Chocolate', 'Cookies & Cream'] }, 
 
    { name: 'Richard', favoriteIceCreams: ['Cookies & Cream', 'Mint Chocolate Chip', 'Chocolate', 'Vanilla'] }, 
 
    { name: 'Amanda', favoriteIceCreams: ['Chocolate', 'Rocky Road', 'Pistachio', 'Banana'] }, 
 
    { name: 'Andrew', favoriteIceCreams: ['Vanilla', 'Chocolate', 'Mint Chocolate Chip'] }, 
 
    { name: 'David', favoriteIceCreams: ['Vanilla', 'French Vanilla', 'Vanilla Bean', 'Strawberry'] }, 
 
    { name: 'Karl', favoriteIceCreams: ['Strawberry', 'Chocolate', 'Mint Chocolate Chip'] } 
 
]; 
 
    
 
console.log(data.reduce((p, c) => { 
 
    c.favoriteIceCreams.forEach(cream => { 
 
    p[cream] = (p[cream] || 0) + 1; 
 
    }); 
 
    return p; 
 
}, {}));

+0

'(p [cream] || 0)+ 1'を' ++ p [cream] ||に減らすことができます。 1 'が、それは少し難読化されるかもしれません。 – RobG

+1

@RobGはい、または '~~ p [cream] + 1' :) – ASDFGerte

0

あなたは、あなたの問題は、2つを持っている0

let res = {} 
for (let {favoriteIceCreams} of data) 
    for (let iceCream of favoriteIceCreams) 
    res[iceCream] = res.hasOwnProperty(iceCream) ? ++res[iceCream] : 1; 
0

に、真の増分値場合、プロパティはオブジェクトに設定されているかどうかを確認するために、他の設定値をfor..ofループ、Object.hasOwnProperty()を使用することができます側面。最初はすべての人々のすべての味を集めています。 2番目は、各フレーバの頻度を数えています。これらの2つの側面を分離すると、コードはよりシンプルになり、デバッグが容易になり、読みやすくなります。すべての味を収集することは、あなたが好むだけ

const flavors = [].concat(...data.map(({favoriteIceCreams}) => favoriteIceCreams)); 

場合や、次のとおりです。

const flavors = []; 

for (const {favoriteIceCreams} of data) flavors.push(...favoriteIceCreams); 

は、アレイ内の発生回数をカウントについてSO上でここに多くのソリューションがあります。 this oneを検討してください。

関連する問題