1

我有數據格式避免嵌套地圖時,「樞轉」多維數組

[ 
    { 
    "timeline_map": { 
     "2017-05-06": 770, 
     "2017-05-07": 760, 
     "2017-05-08": 1250 
     ... 
    } 
    }, 
    { 
    "timeline_map": { 
     "2017-05-06": 590, 
     "2017-05-07": 210, 
     "2017-05-08": 300 
     ... 
    } 
    }, 
    { 
    "timeline_map": { 
     "2017-05-06": 890, 
     "2017-05-07": 2200, 
     "2017-05-08": 1032 
     ... 
    } 
    } 
] 

,爲了一個谷歌圖表我需要改變到格式

[ 
    ["2017-05-06", 770, 590, 890, ...], 
    ["2017-05-07", 760, 210, 2200, ...], 
    ["2017-05-08", 1250, 300, 1032, ...] 
] 

我寫在使用以下做出改造

let mapped = _.map(
    chartData.results[0].timeline_map, (timestampVal, timestampKey) => (
    [timestampKey].concat(
    _.map(
     chartData.results, lineData => (
     lineData.timeline_map[timestampKey] 
     ) 
    ) 
    ) 
) 
) 

這個工程,但我在想嵌套的map s不是一個好主意,因爲它將如何增加被映射數組長度的平方的循環量。有沒有更好的方法來達到預期的效果。

JSBIN

+0

'[「2017-05- 06「:770,590,890,...]'這是無效的JS。無論是[[[「2017-05-06」,...],[「2017-05-07」,...]]或「{」2017-05-06「:[...]」, 2017-05-07「:[...]}'。這是什麼意思? – Thomas

+0

@Thomas這只是一個省略號,表示有更多的日期。鏈接的JSBIN沒有像這樣的僞元素 – 1252748

+0

我不是在談論省略號,我正在談論':' – Thomas

回答

4

你可以使用在哈希表封閉,並相應分配值的日期鍵。

var data = [{ timeline_map: { "2017-05-06": 770, "2017-05-07": 760, "2017-05-08": 1250 } }, { timeline_map: { "2017-05-06": 590, "2017-05-07": 210, "2017-05-08": 300 } }, { timeline_map: { "2017-05-06": 890, "2017-05-07": 2200, "2017-05-08": 1032 } }], 
 
    grouped = data.reduce(function (hash) { 
 
     return function (r, o) { 
 
      Object.keys(o.timeline_map).forEach(function (k) { 
 
       if (!hash[k]) { 
 
        hash[k] = [k]; 
 
        r.push(hash[k]); 
 
       } 
 
       hash[k].push(o.timeline_map[k]); 
 
      }); 
 
      return r; 
 
     }; 
 
    }(Object.create(null)), []); 
 

 
console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

這是正確的路要走,但只需要更進一步就可以得到理想的結果。 – Redu

+0

@Redu,你知道想要的結果嗎? o_O –

+0

我認爲這是第二個片段中顯示的數據格式......但它已經是我的第六個啤酒了,所以也有... – Redu

2

合併使用_.mergeWith()的對象,然後_.map()生成的對象到數組的數組:

const arr = [{ 
 
    "timeline_map": { 
 
     "2017-05-06": 770, 
 
     "2017-05-07": 760, 
 
     "2017-05-08": 1250 
 
    } 
 
    }, 
 
    { 
 
    "timeline_map": { 
 
     "2017-05-06": 590, 
 
     "2017-05-07": 210, 
 
     "2017-05-08": 300 
 
    } 
 
    }, 
 
    { 
 
    "timeline_map": { 
 
     "2017-05-06": 890, 
 
     "2017-05-07": 2200, 
 
     "2017-05-08": 1032 
 
    } 
 
    } 
 
]; 
 

 
const result = _.map(_.mergeWith({}, ...arr, (o1, o2) => { 
 
    if(Array.isArray(o1)) { 
 
    o1.push(o2) 
 
    return o1; 
 
    } 
 
    
 
    if(_.isNumber(o2)) { 
 
    return [o2]; 
 
    } 
 
}).timeline_map, (v, k) => [k, ...v]); 
 

 
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

+0

+1爲清潔解決方案。只要指出擴展運算符在數組達到一定大小後會開始發出調用堆棧溢出錯誤。 – 11thdimension