2017-02-27 6 views
2

たちは奇妙なだけアイテムのタイトルや価値に興味がある販売された商品の虚配列取り配列にそれらを数える:私は私が持つ配列を得ることができます知っているJavascriptを/ ES6ユニークな要素を見つけて、

let items = [ 
    { title: "Trumping the Horns", value: 5.95 }, 
    { title: "Rocking about", value: 20.00 }, 
    { title: "Trumping the Horns", value: 5.95 } 
] 

const uniqueSales = [...new Set(items.map(item => item.title))]; 

しかし、たとえば、私が販売した各商品の数、またはそれらの累積額を知りたいとしますか?したがって:

[ 
    { title: "Trumping the Horns", amount: 2 }, 
    { title: "Rocking about", amount: 1 } 
] 

奇妙な並べ替えとその配列の反復処理を行うことなく、それらも同様にマップできますか?一本のライナーを優先します。サーバー側をしない主な理由は、同じデータに対してかなり異なる操作をしていることです。一度送信してクライアントにデータの操作やプレゼンテーションを処理させるのが最も正しいと思われます。

答えて

2

Mapを使用して、結果配列の新しい挿入オブジェクトへの参照を格納できます。あなたが最後にしたい形式を考えると

var items = [{ title: "Trumping the Horns", value: 5.95 }, { title: "Rocking about", value: 20.00 }, { title: "Trumping the Horns", value: 5.95 }], 
 
    result = items.reduce(
 
     (map => (r, a) => (!map.has(a.title) && map.set(a.title, r[r.push({ title: a.title, amount: 0 }) - 1]), map.get(a.title).amount++, r))(new Map), 
 
     [] 
 
    ); 
 

 
console.log(result)

+0

を生成するために減らします。 – Dennis

0

あなたのアイテムを格納するための配列ではなくマップを使用します。マップのキーはアイテムのタイトルで、値は売り上げアイテムの数量でなければなりません。マップに新しい項目を追加する前に、そのキーがすでに存在するかどうかを確認し、存在する場合は増やし、そうでない場合は新しいキー値ペアをマップに追加する必要があります。

1

let items = [{ 
 
    title: "Trumping the Horns", 
 
    value: 5.95 
 
    }, 
 
    { 
 
    title: "Rocking about", 
 
    value: 20.00 
 
    }, 
 
    { 
 
    title: "Trumping the Horns", 
 
    value: 5.95 
 
    } 
 
]; 
 

 
console.log(items.reduce(function(countMap, item) { 
 
    countMap[item.title] = ++countMap[item.title] || 1; 
 
    return countMap; 
 
}, {}));

+0

これはOPが望む出力を生成しません。 –

1

、私はそれを持つオブジェクトを構築するMapを使用するよりも、はるかに短くなるとは思いませんtitleamountを入力し、次にMapの値を取得:

const items = [ 
 
    { title: "Trumping the Horns", value: 5.95 }, 
 
    { title: "Rocking about", value: 20.00 }, 
 
    { title: "Trumping the Horns", value: 5.95 } 
 
]; 
 
const map = new Map(); 
 
items.forEach(item => { 
 
    const entry = map.get(item.title); 
 
    if (!entry) { 
 
    map.set(item.title, {title: item.title, amount: 1}); 
 
    } else { 
 
    ++entry.amount; 
 
    } 
 
}); 
 
const uniqueSales = [...map.values()]; 
 
console.log(uniqueSales);

...好ましくは、ライナー...

上記より少ない行にshoehornedすることができ、それは速度、読みやすさを改善しません、または保守性を保証します。まったく逆です。 tyvm -

+1

1ライナーと完全に同意します。おそらく言葉の悪い選択だった、私のポイントは、ほとんどの可能な限り簡潔にし、最小量の、そして最も合理的なステップを保つために主にだった。 – Dennis

+0

@Dennis:ニーナのソリューションは、上記(不必要なキー参照)よりも効率が悪いことに注意する価値があります。純粋に、彼女はステートメントではなく表現に靴ひもを入れることができます。さて、あなたが気にしない時間の99.9999%が、どのくらいの文が=最も効率的で、最も少ないステップ数の解決策の例ですか? –

0
let array = [{title:"123"}, {title: "234"}, {title: "123"}] 
let sum = array.reduce((results, item, index) => { 
         let totalItem = results.find((element) => 
          element.title == item.title) 
         if(totalItem){ 
         totalItem.count += 1 
         }else { 
         results.push(Object.assign(item, { 
           count: 1 
          })) 
         } 
         return results 
        }, []) 

使用配列は美しい新しい配列

関連する問題