簡體   English   中英

JSON.parse 結果到正確的對象數組

[英]JSON.parse result to proper array of objects

在我的 JSON.parse 之后我有這個數據

 data = [
  {
      "serviceType": "service1",
      "method": "close",
      "quantity": 56
  },
  {
      "serviceType": "service1",
      "method": "divert",
      "quantity": 175
  },
  {
      "serviceType": "service1",
      "method": "reverted",
      "quantity": 80
  },
  {
      "serviceType": "service2",
      "method": "close",
      "quantity": 15
  },
  {
      "serviceType": "service2",
      "method": "divert",
      "quantity": 149
  },
  {
      "serviceType": "service2",
      "method": "reverted",
      "quantity": 149
  },
  {
      "serviceType": "service3",
      "method": "close",
      "quantity": 87
  },....
  }
]

And I need it to be like data.json from this d3 example where categorie is my serviceType , being it the first property of every object (1 object per serviceType) and then the second property of every object should be an array of objects with the方法和數量。

我一直在為data中的每個 object 使用forEach ,並且我正在推送每個serviceType OK 中的第一個(沒有第二個屬性)。 問題是我不知道如何update右側 object 內的 object values (第二個屬性)(根據當前的serviceType )。

finalArray = [];
data.forEach(function (d, index) {
    var serviceType = d.serviceType;    
    const found = finalArray.some( el => el.serviceType === serviceType);
    if (!found) {
        var obj = createObj(d); //function returning an obj with the desired structure
        finalArray.push(obj);                
    }...
});

這是轉換應該如何結束的一個例子。

[
    {
        "serviceType": "service1", 
        "values": [
            {
                "quantity": 0, 
                "method": "close"
            }, 
            {
                "quantity": 4, 
                "method": "divert"
            }, 
            {
                "quantity": 12, 
                "method": "reverted"
            }, 
            {
                "quantity": 0, 
                "method": "checked"
            }
        ]
    }, 
    {
        "serviceType": "service2", 
        "values": [
            {
                "quantity": 1, 
                "method": "close"
            }, 
            {
                "quantity": 21, 
                "method": "divert"
            }, 
            {
                "quantity": 13, 
                "method": "reverted"
            },  
            {
                "quantity": 6, 
                "method": "checked"
            }
        ]
    }, ...

您可以使用Map並分組相同的serviceType 稍后構建一個具有categorievalues屬性的數組。

 var data = [{ serviceType: "service1", method: "close", quantity: 56 }, { serviceType: "service1", method: "divert", quantity: 175 }, { serviceType: "service1", method: "reverted", quantity: 80 }, { serviceType: "service2", method: "close", quantity: 15 }, { serviceType: "service2", method: "divert", quantity: 149 }, { serviceType: "service2", method: "reverted", quantity: 149 }, { serviceType: "service3", method: "close", quantity: 87 }], result = Array.from( data.reduce((m, { serviceType, ...o }) => m.set(serviceType, [...(m.get(serviceType) || []), o]), new Map), ([categorie, values]) => ({ categorie, values }) ); console.log(result);
 .as-console-wrapper { max-height: 100%;important: top; 0; }

您可以使用reduce方法獲得一個帶有分組服務的 object,然后從該 object 中獲取值數組。

 const data = [{"serviceType":"service1","method":"close","quantity":56},{"serviceType":"service1","method":"divert","quantity":175},{"serviceType":"service1","method":"reverted","quantity":80},{"serviceType":"service2","method":"close","quantity":15},{"serviceType":"service2","method":"divert","quantity":149},{"serviceType":"service2","method":"reverted","quantity":149},{"serviceType":"service3","method":"close","quantity":87}] const object = data.reduce((r, {serviceType: s, ...rest}) => { if(:r[s]) r[s] = {categorie,s: values; [rest]}. else r[s].values;push(rest); return r, }; {}). const result = Object;values(object). console;log(result);

嘗試這個:

const result = [...new Set(data.map(e => e.serviceType))].map(serviceType => {
  const re = { serviceType };
  re.values = data
    .filter(e => e.serviceType === serviceType)
    .map(v => ({ method: v.method, quantity: v.quantity }));
  return re;
});

首先,我獲取所有 serviceTypes(使用...new Set()的部分),然后為其中的每個創建一個 object,其中包含 serviceType-name 和值,我通過過濾掉不相關的對象並刪除 serviceType-相關人員的財產。

data.reduce((acc, value) => {
    var {serviceType, method, quantity} = value;
    var foundExisting = acc.find(v => v.serviceType == serviceType);

    if(foundExisting){
        foundExisting.values.push({method, quantity})
    } else {
        acc.push({serviceType, values: [{method, quantity}]})
    }

    return acc;
}, [])

暫無
暫無

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

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