按属性的Javascript组对象

Fun*_*ion 4 javascript arrays json object underscore.js

我正在尝试按日期对数组中的对象进行分组:

var list = [
     {
         date: "2017-01-01",
         type: "type1",
         amount: 100
     },
     {
         date: "2017-01-01",
         type: "type2",
         amount: 150
     },
     {
         date: "2017-01-02",
         type: "type1",
         amount: 200
     }
]
Run Code Online (Sandbox Code Playgroud)

而我正试图得到类似的东西:

var dateArr = [
   {
      date: "2017-01-01",
      activities: [
        {
           type: "type1",
           amount: 100
        },
        {
           type: "type2",
           amount: 150
        }]
   }
]
Run Code Online (Sandbox Code Playgroud)

我尝试了一些事情......比如使用下划线(来自这里/sf/answers/1112223871/):

var dateArr = _
.chain(list)
.groupBy('date')
.map(function(value, key) {
    return {
        date: key,
        activities: [{
            type: _.pluck(value, 'type'),
            amount: _.pluck(value, 'amount')
        }]
    }
})
.value();
Run Code Online (Sandbox Code Playgroud)

我也试过这个(从这里/sf/answers/2196170231/)

var dateArr = {};
list.forEach(function(item){
    dateArr[item.date] = dateArr[item.date]||[];
    dateArr[item.date].push(item);
});
Run Code Online (Sandbox Code Playgroud)

但是,由于某些原因,两者都返回空.

任何帮助将不胜感激.

She*_*epy 11

几行现代JavaScript将为您提供所需的结果:

var dateArr = Object.values(list.reduce((result, {
    date,
    type,
    amount
}) => {
    // Create new group
    if (!result[date]) result[date] = {
        date,
        activities: []
    };
    // Append to group
    result[date].activities.push({
        type,
        amount
    });
    return result;
}, {}));
Run Code Online (Sandbox Code Playgroud)

阐释:

  1. 使用Array.reduce巩固列表转换成一组结果,一个普通的对象,按日期分组.
  2. 在巩固功能解构该项目分为三个参数.
  3. 然后,如有必要,它会创建一个新组.
  4. 然后,当前项目的类型和金额将作为对象文字的一部分推送到组.
  5. 返回相同的集合reduce,以便下一个项目合并到同一个集合中.
  6. 用于Object.values从集合中提取值.(放下钥匙)


Nin*_*olz 5

您可以将哈希表用于按日期分组,并将单个组分配给结果数组。

var list = [{ date: "2017-01-01", type: "type1", amount: 100 }, { date: "2017-01-01", type: "type2", amount: 150 }, { date: "2017-01-02", type: "type1", amount: 200 }],
    result = [];

list.forEach(function (hash) {
    return function (a) {
        if (!hash[a.date]) {
            hash[a.date] = { date: a.date, activities: []};
            result.push(hash[a.date]);
        }
        hash[a.date].activities.push({ type: a.type, amount: a.amount });
    };
}(Object.create(null)));

console.log(result);
Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { max-height: 100% !important; top: 0; }
Run Code Online (Sandbox Code Playgroud)