2017-05-31 54 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]