簡體   English   中英

轉換數據的邏輯

[英]Logic to Transform data

我有一個api,它以以下格式返回數據:

[
    {
        "_id": 1567362600000,
        "KIDate": "2019-09-02",
        "KITools": [
            {
                "data": 1,
                "tool": "A"
            },
            {
                "data": 2,
                "tool": "B"
            }
        ]
    },
    {
        "_id": 1567519839316,
        "KIDate": "2019-09-01",
        "KITools": [
            {
                "data": 2,
                "tool": "A"
            },
{
                "data": 1,
                "tool": "C"
            }
        ]
    },
    {
        "_id": 1567519839317,
        "KIDate": "2019-08-31",
        "KITools": [
            {
                "data": 0,
                "tool": "C"
            }
        ]
    },
  ]

我想轉換此數據以獲取以下數組:

Result 1 -  [“2019-09-02”,”2019-09-01”,”2019-08-31”]
Result 2 -  [ {name: ‘A’, data:[1, 2, 0] }, { name: 'B', data: [2, 0, 0] }, { name: 'C', data: [0, 1, 0]}]

目前,我可以通過使用循環和按工具名稱定義變量來實現此目的,例如跟蹤並循環api數據以將其放入該變量。

var result2 = [{名稱:'A',數據:[]},{名稱:'B',數據:[]},{名稱:'C',數據:[]}];

但這不是預期的行為,工具名稱可以更改,我必須根據api返回的數據來動態地弄清楚這一點。 沒有瘋狂的循環,實現此目標的最佳方法是什么。

您可以使用reduce方法獲取每個工具的日期數組和值對象的結果。

 const data = [{"_id":1567362600000,"KIDate":"2019-09-02","KITools":[{"data":1,"tool":"A"},{"data":2,"tool":"B"}]},{"_id":1567519839316,"KIDate":"2019-09-01","KITools":[{"data":2,"tool":"A"},{"data":1,"tool":"C"}]},{"_id":1567519839317,"KIDate":"2019-08-31","KITools":[{"data":0,"tool":"C"}]}] const result = data.reduce((r, {KIDate, KITools}, i) => { r.dates.push(KIDate); KITools.forEach(({data: dt, tool}) => { if(!r.values[tool]) r.values[tool] = Array(data.length).fill(0); r.values[tool][i] = dt }) return r; }, {dates: [], values: {}}) console.log(result) 

您可以對SetMap使用reduceforEach

  • 使用datesdata鍵將累加器初始化為對象, datesSet ,數據是Map
  • 對於每個元素,將KIDate添加到日期鍵,
  • 遍歷KITools ,檢查該數據Map是否也存在該特定KITools ,如果存在,則通過將當前值添加到id來更新其值;如果未按照當前值設置其值

 let data = [{"_id": 1567362600000,"KIDate": "2019-09-02","KITools": [{"data": 1,"tool": "A"},{"data": 2,"tool": "B"}]},{"_id": 1567519839316,"KIDate": "2019-09-01","KITools": [{"data": 2,"tool": "A"},{"data": 1,"tool": "C"}]},{"_id": 1567519839317,"KIDate": "2019-08-31","KITools": [{"data": 0,"tool": "C"}]},] let final = data.reduce((op,{KIDate,KITools})=>{ op.dates.add(KIDate) KITools.forEach(({data,tool})=>{ if(op.data.has(data)){ op.data.get(data).data.push(tool) } else{ op.data.set(data, {name: data, data:[tool]}) } }) return op },{dates:new Set(),data: new Map()}) console.log([...final.dates.values()]) console.log([...final.data.values()]) 

可以通過直接.map()獲得result1數組。 要構建result2數組將需要額外的工作-一種方法是通過.reduce() ,如下所示:

 const data=[{"_id":1567362600000,"KIDate":"2019-09-02","KITools":[{"data":1,"tool":"A"},{"data":2,"tool":"B"}]},{"_id":1567519839316,"KIDate":"2019-09-01","KITools":[{"data":2,"tool":"A"},{"data":1,"tool":"C"}]},{"_id":1567519839317,"KIDate":"2019-08-31","KITools":[{"data":0,"tool":"C"}]}]; const result1 = data.map(item => item.KIDate); const result2 = data.reduce((result, item) => { item.KITools.forEach(kitool => { /* For current item, search for matching tool on name/tool fields */ let foundTool = result.find(i => i.name === kitool.tool); if (foundTool) { /* Add data to data sub array if match found */ foundTool.data.push(kitool.data); } else { /* Add new tool if no match found and init name and data array */ result.push({ name: kitool.tool, data: [kitool.data] }); } }); return result; }, []).map((item, i, arr) => { /* Second phase of processing here to pad the data arrays with 0 values if needed */ for (let i = item.data.length; i < arr.length; i++) { item.data.push(0); } return item; }); console.log('result1:', result1); console.log('result2:', result2); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM