首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >计算每天的元素数Javascript

计算每天的元素数Javascript
EN

Stack Overflow用户
提问于 2017-06-01 02:13:19
回答 3查看 730关注 0票数 0

我有像下面这样的对象数组。

代码语言:javascript
代码运行次数:0
运行
复制
[
  {
    name: 'order-1',
    date: '2017-05-30 16:38:30.418Z'
  },
  {
    name: 'order-2',
    date: '2017-05-30 16:38:30.418Z'
  },
  {
    name: 'order-3',
    date: '2017-05-31 16:38:30.418Z'
  }
]

我想计算一下每天有多少个对象,并创建一个数组,如下所示:[1, 2]

我可以使用underscore.js和moment库按天对记录进行分组

代码语言:javascript
代码运行次数:0
运行
复制
_.groupBy(orders, function order) {
  return moment(order.created).startOf('day').format();
});

我如何计算下面的元素?

代码语言:javascript
代码运行次数:0
运行
复制
[
  {
    "2017-05-30T00:00:00+02:00": [
      {
        name: 'order-1',
        date: '2017-05-30 16:38:30.418Z'
      },
      {
       name: 'order-2',
       date: '2017-05-30 16:38:30.418Z'
       }
     ]
    },
    {
      "2017-05-30T00:00:00+02:00": [
        {
          name: 'order-3',
          date: '2017-05-31 16:38:30.418Z'
        }
      ]
    }
  }
]
EN

回答 3

Stack Overflow用户

发布于 2017-06-01 02:24:48

您可以使用.reduce()函数计算给定一天的发生次数,如下所示:

_.groupBy().map()相比,使用.reduce()的优点是您只需迭代数据集一次,从而(稍微)提高了效率。

代码语言:javascript
代码运行次数:0
运行
复制
var orders = [
  {
    name: 'order-1',
    date: '2017-05-30 16:38:30.418Z'
  },
  {
    name: 'order-2',
    date: '2017-05-30 16:38:30.418Z'
  },
  {
    name: 'order-3',
    date: '2017-05-31 16:38:30.418Z'
  }
];

dayCounts = orders.reduce(function (result, order) {
    var day = moment(order.date).format("YYYY-MM-DD");
    if (!result[day]) {
        result[day] = 0;
    }
    result[day]++;
    return result;
}, {});

console.log(dayCounts);
代码语言:javascript
代码运行次数:0
运行
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.js"></script>

票数 2
EN

Stack Overflow用户

发布于 2017-06-01 02:21:55

可能是这样的:

代码语言:javascript
代码运行次数:0
运行
复制
var orders = [
    {
        name: 'order-1',
        date: '2017-05-30 16:38:30.418Z'
    },
    {
        name: 'order-2',
        date: '2017-05-30 16:38:30.418Z'
    },
    {
        name: 'order-3',
        date: '2017-05-31 16:38:30.418Z'
    }
];
var res = _.chain(orders)
.groupBy(function(order) {
    return moment(order.date).startOf('day').format();
})
.map(function(obj){
    return obj.length;
})
.value();


console.log(res); //[ 2, 1 ]

编辑:与.reduce()相比,使用_的优点是它(稍微)更具可读性,并且结果是所请求的格式。

票数 1
EN

Stack Overflow用户

发布于 2017-06-01 02:40:00

你可以这样做:

代码语言:javascript
代码运行次数:0
运行
复制
var orders = [
  {
    name: 'order-1',
    date: '2017-05-30 16:38:30.418Z'
  },
  {
    name: 'order-2',
    date: '2017-05-30 16:38:30.418Z'
  },
  {
    name: 'order-3',
    date: '2017-05-31 16:38:30.418Z'
  }
];

var res = [];

orders.forEach(function (elem) {
    var date = elem.date.split(' ')[0];


    if (res[date]) {
        res[date] += 1;
    } else {
        res[date] = 1;
    }
});

console.log(res); // [2017-05-30: 2, 2017-05-31: 1]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44291965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档