使用 lodash 创建填充缺失值的新数组
Make new array that fills in missing values using lodash
我有一个对象数组,其 属性 为 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 您可以检查元素的地方。谢谢!
两期:
data
中的date
是一个字符串;您正在将其与数字进行比较。请参阅 http://jsfiddle.net/davelnewton/dst9nk6p/1/ 了解简单的修复方法。
list
数组只有四个元素,因此您只能返回四个值。你在倒着画地图;您想要遍历 data
的键并检查它们是否在 list
. 中
如果 list
变大,这会降低效率;您可能还想将这些值放入地图中,这样就不必为每个 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: 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 link: http://jsfiddle.net/96xmjf3x/
我有一个对象数组,其 属性 为 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 您可以检查元素的地方。谢谢!
两期:
data
中的date
是一个字符串;您正在将其与数字进行比较。请参阅 http://jsfiddle.net/davelnewton/dst9nk6p/1/ 了解简单的修复方法。list
数组只有四个元素,因此您只能返回四个值。你在倒着画地图;您想要遍历data
的键并检查它们是否在list
. 中
如果 list
变大,这会降低效率;您可能还想将这些值放入地图中,这样就不必为每个 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: 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 link: http://jsfiddle.net/96xmjf3x/