2016-05-16 81 views
0

我有对象的一个​​这样的数组:lodash:从对象的数组计数值

[ 
{"question":"Q1","answer":"my answer 2"}, 
{"question":"Q1","answer":"my answer"} 
{"question":"Q1","answer":"my answer"} 
{"question":"Q2","answer":"answer 2"} 
] 

我想按的问题键和返回每个答案的计数。

例如

{ 
    "Q1": [{ 
     "answer": "my answer", 
     "count": 2 
    }, { 
     "answer": "my answer 2", 
     "count": 1 
    }], 
    "Q2": [{ 
     "answer": "answer 2", 
     "count": 1 
    }] 
} 

我能够groupBy问题使用:使用.countBy().groupBy("question")和计数occurances但我不知道如何分组合并及计数功能,以实现所需的输出?

+0

是否允许在您的情况下使用“native javascript”方法? – RomanPerekhrest

+0

当然,虽然我在这个项目中使用lodash会比较有趣,比较如何可以没有。 – Gids

回答

2

您可以_.groupBy(array, 'question')开始 - 然后用.map

例如:

var arr = [ 
{"question":"Q1","answer":"my answer 2"}, 
{"question":"Q1","answer":"my answer"}, 
{"question":"Q1","answer":"my answer"}, 
{"question":"Q2","answer":"answer 2"} 
]; 

var result = _(arr) 
    .groupBy('question') 
    .map(function(item, itemId) { 
    var obj = {}; 
    obj[itemId] = _.countBy(item, 'answer') 
    return obj 
    }).value(); 

console.log(JSON.stringify(result, null, 2)); 

参见工作版本在:http://jsbin.com/wixoronoqi/edit?js,console

+3

我认为使用[mapValues()](https://lodash.com/docs#mapValues)而不是[map()](https://lodash.com/docs#map)会更好,并且只是直接返回[countBy()](https://lodash.com/docs#countBy)值。 – ryeballar

+0

我不知道'mapValues',但是,使用'mapValues'会有所改进 – Filype

0

使用Array.forEachArray.push功能的 “本地JavaScript” 的解决方案:

var arr = [{"question":"Q1","answer":"my answer 2"},{"question":"Q1","answer":"my answer"}, {"question":"Q1","answer":"my answer"}, {"question":"Q2","answer":"answer 2"}]; 

var result = {}; 
arr.forEach(function(v){ 
    var key = v['question'], Q = this[key], found = false; 
    if (Q) { 
     var len = Q.length; 
     while (len--) { 
      if (Q[len]['answer'] === v['answer']) { 
       Q[len]['count']++; 
       found = true; 
      } 
     } 
     if (!found) Q.push({'answer': v['answer'], 'count' : 1}); 
    } else { 
     this[key] = []; 
     this[key].push({'answer': v['answer'], 'count' : 1}); 
    } 
}, result); 

console.log(JSON.stringify(result, 0, 4)); 

输出:

{ 
    "Q1": [ 
     { 
      "answer": "my answer 2", 
      "count": 1 
     }, 
     { 
      "answer": "my answer", 
      "count": 2 
     } 
    ], 
    "Q2": [ 
     { 
      "answer": "answer 2", 
      "count": 1 
     } 
    ] 
}