简体   繁体   English

JSON.parse 结果到正确的对象数组

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

after my JSON.parse I have this data在我的 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 method and quantity. 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方法和数量。

I've been using forEach for every object in data and I'm pushing the first of every serviceType OK (without the 2nd property).我一直在为data中的每个 object 使用forEach ,并且我正在推送每个serviceType OK 中的第一个(没有第二个属性)。 The problem is I don't know how to update the object values (second property) inside the right object (according to the current serviceType ).问题是我不知道如何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);                
    }...
});

This is an example of how the conversion should end up being.这是转换应该如何结束的一个例子。

[
    {
        "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"
            }
        ]
    }, ...

You could take a Map and group same serviceType .您可以使用Map并分组相同的serviceType Later build an a array with categorie and values properties.稍后构建一个具有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; }

You can get one object with grouped services using reduce method and then get array of values from that object.您可以使用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);

Try this:尝试这个:

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;
});

First I get all the serviceTypes (the part using ...new Set() ), then I create an object for each thereof consisting of the serviceType-name and the values, which I get by filtering out unrelated objects and dropping the serviceType-property of the related ones.首先,我获取所有 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