javascript - 使用 lodash 创建填充缺失值的新数组

标签 javascript arrays date 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你可以在哪里检查元素。谢谢!

最佳答案

这是你想要的结果吗

[ { 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/

相关文章:

javascript - WebGL 多 Canvas three.js 示例

javascript - 功能组件中 useEffect() 内的 useState()

javascript - JSON 仅解析对象

javascript - Rails 4 - 从客户端删除数组元素并提交

php - 从 mysql 数据库获取加入日期并将其作为可读格式回显

带字符串的 JavaScript 日期

javascript - 在中心位置屏幕中将 div 内的 IFrame 居中

C编程;使用随机数生成二维矩阵而不重复

javascript - AngularJS - 在数组中单步执行数组

java - 在 Java 中解析一个字符串到日期