2017-05-31 82 views
0

我有一些像下面这样的对象。每天计算一次元素Javascript

[ 
    { 
    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和力矩库

_.groupBy(orders, function order) { 
    return moment(order.created).startOf('day').format(); 
}); 

我怎么能算以下要素天?

[ 
    { 
    "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' 
     } 
     ] 
    } 
    } 
] 
+0

如何是'[1,2]'有益的输出格式?你如何知道阵列中的哪个元素与当年的哪一天相对应? – mhodges

回答

1

也许是这样的:

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()的优势在于它是(略)更具可读性,其结果是在所要求的格式。

+0

哈哈,我没有对你开枪,我只是在解释这个区别。使用'.reduce()'可以很容易地得到所需格式的结果,这对使用'_'没有什么特别之处。我知道你知道这一点。不过,有趣的是,你的输出实际上不是所要求的格式,因为它被要求输出'[1,2]'。 – mhodges

1

您可以使用.reduce()函数计算出现的次数为某一天,就像这样:

使用.reduce()_.groupBy().map()是,你只遍历设置一次数据,使得它(略)的优点更高效。

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);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.js"></script>

1

你可以这样说:

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]