Javascript按属性分组对象

标签 javascript arrays json object underscore.js

关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。












此问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-topic在这里,这个问题的解决方式不太可能帮助 future 的读者。


5年前关闭。







Improve this question




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

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
     }
]

我试图得到类似的东西:
var dateArr = [
   {
      date: "2017-01-01",
      activities: [
        {
           type: "type1",
           amount: 100
        },
        {
           type: "type2",
           amount: 150
        }]
   }
]

我已经尝试了一些事情......像这样使用下划线(从这里 https://stackoverflow.com/a/15888912/4989305 ):
var dateArr = _
.chain(list)
.groupBy('date')
.map(function(value, key) {
    return {
        date: key,
        activities: [{
            type: _.pluck(value, 'type'),
            amount: _.pluck(value, 'amount')
        }]
    }
})
.value();

我也试过这个(从这里 https://stackoverflow.com/a/31373860/4989305 )
var dateArr = {};
list.forEach(function(item){
    dateArr[item.date] = dateArr[item.date]||[];
    dateArr[item.date].push(item);
});

但是,由于某种原因,两者都返回空。

任何帮助将不胜感激。

最佳答案

几行现代 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;
}, {}));

解释:
  • 使用 Array.reduce 将列表合并为一组结果,一个普通对象,按日期分组。
  • 合并功能destructure该项目分为三个参数。
  • 然后,如有必要,它会创建一个新组。
  • 然后将当前项目的类型和数量作为 object literal 的一部分推送到组中。 .
  • 相同的集合返回到 reduce ,以便下一个项目将合并到同一个集合中。
  • 使用 Object.values 从集合中提取值。 (放下 key )
  • 关于Javascript按属性分组对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42480663/

    相关文章:

    javascript - 如何使用多个请求创建 Promise.all

    javascript - 验证不起作用仍在提交表单

    C++多维数组容量

    javascript - 如何使用 javascript 中的范围在最小值和最大值之间创建比例?

    java - 处理数组中的重叠数字

    javascript - 向从 JSON 响应构造的对象添加函数

    javascript - 如何处理ajax 201

    java - Jackson 自定义字符串到日期序列化器

    c# - 序列化 JSON 时忽略空值

    javascript - Angular.js 2 : Access component of a directive