javascript - JSON.parse 结果为正确的对象数组

标签 javascript json

在我的 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
  },....
  }
]

我需要它像 d3 example 中的 data.json 一样其中 categorie 是我的 serviceType,它是每个对象的第一个属性(每个服务类型 1 个对象),然后每个对象的第二个属性应该是一个对象数组,其中包含方法及数量。

我一直在对data中的每个对象使用forEach,并且我正在推送每个serviceType中的第一个OK(没有第二个)属性(property))。问题是我不知道如何更新正确对象内的对象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; }

关于javascript - JSON.parse 结果为正确的对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58509662/

相关文章:

java - Sitebricks JSON 默认序列化器。为什么它返回 text/json 而不是 application/json

ios - NSJSONSerializer 如何确定给定数据的编码?

javascript - 未捕获的类型错误 : Cannot read property 'split' of undefined

javascript - 如何在jquery中对表的单列进行 block 排序

javascript - 在 NodeJS 中使用参数获取 Express Route URL

lisp 中的 json-get 函数

java - 使用 Jackson 将带有下划线的 JSON 反序列化为 Java 中的驼峰式大小写?

javascript - 如何根据另一个数组的顺序对一个对象数组进行排序?

javascript - 为什么我在 querySelectorAll 上收到错误 TS2339,因为复选框属性 'checked' 不存在

javascript - Yii2 - 如何使用 javascript 在动态形式 wbraganca 中循环