使用lodash将数据分组然后映射到数组中

时间:2017-01-24 15:25:18

标签: javascript object mapping grouping lodash

我希望将一些数据分组然后映射(我认为最好的方法,可能是错误的)到我创建了以下JSFiddle的数组中。

JSFiddle

JSFiddle显示了所需的结果以及我注释掉的一些方法。

我的代码如下:

var answers = [
  { 'question_id': 1, 'id': 1,  'answer': 'Cat' },
  { 'question_id': 1,   'id': 2,  'answer': 'Dog' },
  { 'question_id': 2, 'id': 3,  'answer': 'Fish' },
  { 'question_id': 2,   'id': 4,  'answer': 'Ant' }
];

var result=_.chain(answers).groupBy("question_id").map(function(v, i) {
  return {
    question_id: i,
 //   id: _.get(_.find(v, 'id'), 'id'),
    answers:[
        {id: 1, answer: 'Cat'},
            {id: 2, answer: 'Dog'},
//  {id: _.map(v, 'id'), answer: _.map(v, 'answer'),}
    ] 
  }
}).value();
document.body.innerHTML = '<pre>' + JSON.stringify(result, null, '  ') + '</pre>';

2 个答案:

答案 0 :(得分:1)

我们遍历数组中的每个对象,并将其推送到以question_id为键的对象。如果一个不存在,我们创建它。然后我们将结果对象转换为数组。

var answers = [
  { 'question_id': 1, 'id': 1,  'answer': 'Cat' },
  { 'question_id': 1,   'id': 2,  'answer': 'Dog' },
  { 'question_id': 2, 'id': 3,  'answer': 'Fish' },
  { 'question_id': 2,   'id': 4,  'answer': 'Ant' }
];
var result = {};
for (var i = 0; i < answers.length; i++) {
  var question_id = answers[i].question_id;
  if(!result[question_id]) {
    result[question_id] = {question_id: question_id, answers: []};
  }
  result[question_id].answers.push({id: answers[i].id, answer: answers[i].answer})
}
result = Object.keys(result).map(function (key) { return result[key]; });
console.log(result);

答案 1 :(得分:1)

你快到了。要获得没有'question_id'的答案,您需要在它们之间进行映射并omit该属性。这可以使用地图的函数来完成:

answers: _.map(v, function(answer){
    return _.omit(answer, 'question_id');
}

或使用omit函数,其中已经应用了一些参数,然后将其用作map的函数:

var omitQuestion = _.partialRight(_.omit, 'question_id');

answers: _.map(v, omitQuestion)