2015-06-09 70 views
0

我有一個具有date屬性(以毫秒爲單位)的對象數組。請注意,前三個對象具有相同的日期,但不同的是value使用lodash創建填充缺失值的新陣列

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

你提供了錯誤的jsfiddle鏈接:http://jsfiddle.net/airwwwave/y8mbhub7/1/ –

+0

哎呀,對不起。剛剛更新鏈接以刪除鏈接末尾的「嵌入/結果/」部分。謝謝。希望現在如果你檢查頁面上的元素,你可以在控制檯中看到東西。道歉。 – airwwwave

+0

我還應該說我沒有結婚使用lodash,這正是我根據本教程嘗試的:http://www.d3noob.org/2014/04/adding-in-zero-values-into- time-series.html – airwwwave

回答

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

首先,創建要確保出現在你的數據的所有日期的列表。然後for each添加不存在的默認值。

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/

+0

這看起來可能就是這樣!讓我試試看吧...... – airwwwave

+1

是的,這個工作非常漂亮,雖然我需要一些時間來研究它,掌握所有你如何做到的。是的,最終我可能會想要對這些進行排序。最終將會有大約20000行。再次感謝! – airwwwave

1

兩個問題:

  1. datadate是一個字符串;你將它與數字進行比較。查看http://jsfiddle.net/davelnewton/dst9nk6p/1/的簡單修復。
  2. list數組只有四個元素,所以你只能得到四個值。你正在倒轉地圖;你想遍歷data的密鑰並檢查它們是否在list

如果list變大,這會使效率低下;您可能也想將這些值放入地圖中,因此不必爲每個data重複該陣列。

+0

1)啊,謝謝你指出字符串/數字! 2)我明白了。我顛倒了數據和列表,並得到正確數量的對象!然而,我不確定第26行應該發佈什麼,而不是{date:dateValue}。現在它將整個對象放在那裏? [一個新的JSFIDDLE](http://jsfiddle.net/airwwwave/83cg11mL/) – airwwwave

+0

@airwwwave更像是http://jsfiddle.net/davelnewton/df6monz2 –

+0

@airwwwave如果數組的大小可以變大,你應該可能使用地圖,所以你有O(1)有效的日期查找; http://jsfiddle.net/davelnewton/9qcugpgy/ –