我有一个对象数组,它们具有以毫秒为单位的 date
属性。请注意,前三个对象具有相同的日期,但 value
不同。
var data = [
{"date":"1420070400000","value":53,"lat":"41.8089","lon":"-88.0111","regType":"Client","jobRole":"Other"},
{"date":"1420070400000","value":376,"lat":"41.8089","lon":"-88.0111","regType":"Client","jobRole":"Other"},
{"date":"1420070400000","value":43,"lat":"41.8089","lon":"-88.0111","regType":"Client","jobRole":"Other"},
{"date":"1420156800000","value":410,"lat":"41.8089","lon":"-88.0111","regType":"Client","jobRole":"Other"},
{"date":"1420329600000","value":210,"lat":"41.8089","lon":"-88.0111","regType":"Client","jobRole":"Other"}
];
console.log(data)
显示第一个对象:
date: "1420070400000"jobRole: "Other"lat: "41.8089"lon: "-88.0111"regType: "Client"value: 53
然后,我有第二个日期数组(以毫秒为单位),涵盖第一个数组的最早日期和最晚日期之间的所有可能日期。
var earliestDate = 1420070400000;
var latestDate = 1420329600000;
var list = [];
for (var i = earliestDate; i <= latestDate; i += 86400000) {
list.push(i);
}
并且 console.log(list)
显示了该数组:
[1420070400000, 1420156800000, 1420243200000, 1420329600000]
请注意,第三个日期 1420243200000
是存在于最早日期和最晚日期之间的日期,但不在原始对象数组中。该原始数组不包括范围内的每个日期。
我想要一个对象的结果数组(如第一个),但每个日期都在范围内。因此,当原始数组中不存在日期时,现在它存在,并且已将新值分配给它的其他属性。
我正在尝试在 lodash 中使用 _.find
。
var newData = list.map(function(dateValue) {
return _.find(data, { date: dateValue }) || {date: dateValue, value: 0, lat: "no lat value", lon: "no lon value", regType: "no regType value", jobRole: "no jobRole value" };
});
但是,console.log(newData);
显示了这一点(这里是第一个对象),它正在将新值分配给现有日期,这是我不想要的:
date: 1420070400000jobRole: "no jobRole value"lat: "no lat value"lon: "no lon value"regType: "no regType value"value: 0
此外,它只返回 4 个对象,而最初有 5 个对象。我错过了什么?
这是 JSFIDDLE你可以在哪里检查元素。谢谢!
最佳答案
这是你想要的结果吗
[ { date: '1420070400000',
value: 53,
lat: '41.8089',
lon: '-88.0111',
regType: 'Client',
jobRole: 'Other' },
{ date: '1420070400000',
value: 376,
lat: '41.8089',
lon: '-88.0111',
regType: 'Client',
jobRole: 'Other' },
{ date: '1420070400000',
value: 43,
lat: '41.8089',
lon: '-88.0111',
regType: 'Client',
jobRole: 'Other' },
{ date: '1420156800000',
value: 410,
lat: '41.8089',
lon: '-88.0111',
regType: 'Client',
jobRole: 'Other' },
{ date: '1420329600000',
value: 410,
lat: '41.8089',
lon: '-88.0111',
regType: 'Client',
jobRole: 'Other' },
{ date: '1420243200000',
value: 0,
lat: 'no lat value',
lon: 'no lon value',
regType: 'no regType value',
jobRole: 'no jobRole value' } ]
在这里你可以使用_.find
首先,创建一个列表,列出您要确保出现在数据中的所有日期。然后 forEach 添加不存在的默认值。
var earliestDate = 1420070400000;
var latestDate = 1420329600000; // inclusive
(function(begin,end,increment){
// faux array comprehension
return Array.apply(null, {length: Math.floor((end+increment-begin)/increment)})
.map(Number.call, function (n) {
return begin + (n*increment);
});
})(earliestDate, latestDate, 86400000)
.forEach(function (fillDate) {
if( _.find(data,function (row) {
return parseInt(row.date) === fillDate;
}) === undefined){
data.push({"date":fillDate.toString(),"value": 0,"lat": "no lat value","lon": "no lon value","regType": "no regType value","jobRole": "no jobRole value" });
}
});
console.log(data);
如果您需要按日期排序,那么您可以在之后.sort 数据。 这不是实现此目的的最佳方式,但它可以在不更改数据结构的情况下工作。
fiddle 链接:http://jsfiddle.net/96xmjf3x/
关于javascript - 使用 lodash 创建填充缺失值的新数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30738345/