使用lodash

时间:2015-06-09 16:56:47

标签: 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个对象。我错过了什么?

这里是您可以检查元素的JSFIDDLE。谢谢!

2 个答案:

答案 0 :(得分:1)

两个问题:

  1. date中的data是一个字符串;你将它与数字进行比较。有关简单修复的信息,请参阅http://jsfiddle.net/davelnewton/dst9nk6p/1/
  2. list数组只有四个元素,因此您只能获得四个值。你正在向后做地图;您希望迭代data个密钥并检查它们是否在list
  3. 如果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 数据。 这不是最佳方式,但它可以在不改变数据结构的情况下工作。

小提琴链接:http://jsfiddle.net/96xmjf3x/