我有一个对象数组,其属性为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个对象。我错过了什么?
这里是您可以检查元素的JSFIDDLE。谢谢!
答案 0 :(得分:1)
两个问题:
date
中的data
是一个字符串;你将它与数字进行比较。有关简单修复的信息,请参阅http://jsfiddle.net/davelnewton/dst9nk6p/1/。list
数组只有四个元素,因此您只能获得四个值。你正在向后做地图;您希望迭代data
个密钥并检查它们是否在list
。如果list
变大,这将使效率低下;您可能希望将这些值放入映射中,因此不必为每个data
迭代数组。
答案 1 :(得分:1)
这是您想要的结果
[ { 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 数据。 这不是最佳方式,但它可以在不改变数据结构的情况下工作。