2017-12-14 10 views
4

オブジェクトのjavascript配列の再編成(私は動的に構築し、そのエントリの数を、別の答えが異なります):私は質問と異なる回答の配列んだ

var qaArray = [ 
    { question: "Question", answer: "Answer A"}, 
    { question: "Question", answer: "Answer B"}, 
    { question: "Question", answer: "Answer B"}, 
    { question: "Question", answer: "Answer C"}, 
    { question: "Question", answer: "Answer A"}, 
    { question: "Question", answer: "Answer B"}, 
    { question: "Question", answer: "Answer C"}, 
    { question: "Question", answer: "Answer A"}, 
    { question: "Question", answer: "Answer B"}, 
] 

私が必要「答え」と「数」を保持することになる、ここから別の配列オブジェクトを構築するための機能が、この場合には、それは次のようになります。

[ 
    { answer: "Answer A", count: 3 }, 
    { answer: "Answer B", count: 4 }, 
    { answer: "Answer C", count: 2 }, 
] 

はまっすぐループせずに、これを行う簡単な方法はありますか?

+0

私はお勧めしますここで 'lodash'を使い、' groupBy'を使って簡単に実行します –

答えて

3

、それをすることによって行うことができます。コンセプトは、存在しない場合はアキュムレータに要素をプッシュし、入力した場合はcountをインクリメントすることです。

ので、同様にあなたは、カウントを取得するために、データオーバーreduceをあなたの答えをキーにMapを使用することができソリューション

var qaArray = [ 
 
    { question: "Question", answer: "Answer A"}, 
 
    { question: "Question", answer: "Answer B"}, 
 
    { question: "Question", answer: "Answer B"}, 
 
    { question: "Question", answer: "Answer C"}, 
 
    { question: "Question", answer: "Answer A"}, 
 
    { question: "Question", answer: "Answer B"}, 
 
    { question: "Question", answer: "Answer C"}, 
 
    { question: "Question", answer: "Answer A"}, 
 
    { question: "Question", answer: "Answer B"}, 
 
] 
 

 

 
result = qaArray.reduce((acc, item) => { 
 
    var exist = acc.find(x => x.answer === item.answer); 
 
    if (exist) { 
 
    exist.count += 1; 
 
    } else { 
 
    acc.push({ 
 
     answer: item.answer, 
 
     count: 1 
 
    }) 
 
    } 
 
    return acc; 
 
}, []); 
 

 

 
console.log(result);

2

reduceまたはforEachのないソリューションをお探しの場合は、lodashを使用して冗長な方法を使用してください。

_.countByのような結果が得られますが、希望するとおりに配列に変換する場合は、mapValuesを使用してください。あなたはこのためreduceを使用することができます

var qaArray = [ 
 
    { question: "Question", answer: "Answer A"}, 
 
    { question: "Question", answer: "Answer B"}, 
 
    { question: "Question", answer: "Answer B"}, 
 
    { question: "Question", answer: "Answer C"}, 
 
    { question: "Question", answer: "Answer A"}, 
 
    { question: "Question", answer: "Answer B"}, 
 
    { question: "Question", answer: "Answer C"}, 
 
    { question: "Question", answer: "Answer A"}, 
 
    { question: "Question", answer: "Answer B"}, 
 
]; 
 

 
var result = [...new Set(qaArray.map(q => q.answer))].map(a => ({ answer: a, count: qaArray.filter(e => e.answer === a).length })); 
 

 
console.log(result);

2

:ES6は問題ではない場合

_.chain(qaArray) 
.countBy('answer') 
.mapValues(function(value, key) { 
    return { answer: key, count: value } 
}) 
.values() 
.value() 
1

の下に見つけてください:

var result = Array.from(qaArray.reduce((acc, { answer }) => { 
    const current = acc.get(answer) || { answer, count: 0 }; 
    current.count++; 
    return acc.set(answer, current); 
}, new Map()).values()); 

console.log(result); 
関連する問題