首页 > 解决方案 > 在 JavaScript 中展平 JSON 对象

问题描述

我有一个 JSON 响应,我需要根据条件展平一些对象。

就我而言,条件是 if object === "$"

我还需要将一些数组展平为仅字符串。管理此问题的最佳方法是什么?有什么库推荐吗?

最终目标是将其用作 GraphQL 模式。

JSON 响应是:

[
   {
      "$":{
         "product_id":"110015888426488829026466000222",
         "name":"Belstaff Trialmaster Pro W Motorradjacke Schwarz",
         "sku_number":"B000134394",
         "manufacturer_name":"BELSTAFF",
         "part_number":"42050011L81N03379005436"
      },
      "discount":[
         {
            "$":{
               "currency":"EUR"
            },
            "type":[
               "amount"
            ]
         }
      ],
      "price":[
         {
            "$":{
               "currency":"EUR"
            },
            "sale":[
               "1195.00"
            ],
            "retail":[
               "1195.00"
            ]
         }
      ],
      "shipping":[
         {
            "cost":[
               {
                  "$":{
                     "currency":"EUR"
                  },
                  "amount":[
                     "0.00"
                  ],
                  "currency":[
                     "EUR"
                  ]
               }
            ],
            "information":[
               "3–7 Werktage"
            ],
            "availability":[
               "in-stock"
            ]
         }
      ],
      "attributeClass":[
         {
            "$":{
               "class_id":"60"
            },
            "Product_Type":[
               "Motorcycle"
            ],
            "Size":[
               "36,38,40,42,44,46,48"
            ],
            "Material":[
               "Waxed Leather"
            ],
            "Color":[
               "Schwarz"
            ],
            "Gender":[
               "Female"
            ],
            "Age":[
               "Adult"
            ]
         }
      ]
   },
   ...
]

而且我要

[
   {
      "product_id":"110015888426488829026466000222",
      "name":"Belstaff Trialmaster Pro W Motorradjacke Schwarz",
      "sku_number":"B000134394",
      "manufacturer_name":"BELSTAFF",
      "part_number":"42050011L81N03379005436"
      "discount":{
          "currency":"EUR"
          "type":"amount"
      },
      "price":{
         "currency": "EUR",
         "sale": "1195.00",
         "retail": "1195.00"
      },
      "shipping":[
         "cost":{
            "currency": "EUR"
            "amount": "0.00",
            "currency": "EUR"
         },
         "information":"3–7 Werktage",
         "availability": "in-stock"
      ],
      "attributeClass":{
         "class_id":"60",
         "Product_Type": "Motorcycle",
         "Size": "36,38,40,42,44,46,48",
         "Material": "Waxed Leather",
         "Color": "Schwarz",
         "Gender": "Female",
         "Age": "Adult"
      }
   },
   ...
]

我尝试了什么:

const flatJson = async data => {
  try {
    const newData = await Promise.all(json.map( async (item, i) => {
      xxx
    }));
    return newData
  }
  catch(err) {
    console.log(err)
  }
};

标签: javascriptnode.jsjson

解决方案


您可以将各种类型转换为单个对象。

const convert = object => {
    if (!object || typeof object !== 'object') return object;
    if (Array.isArray(object)) {
        return object.every(v => typeof v === 'string')
            ? object.join()
            : Object.assign({}, ...object.map(convert));
    }
    return Object.fromEntries(Object.entries(object).flatMap(([k, v]) =>
        k === '$'
            ? Object.entries(v).map(([k, v]) => [k, convert(v)])
            : [[k, convert(v)]]
    ));
};

var data = [{ $: { product_id: "110015888426488829026466000222", name: "Belstaff Trialmaster Pro W Motorradjacke Schwarz", sku_number: "B000134394", manufacturer_name: "BELSTAFF", part_number: "42050011L81N03379005436" }, discount: [{ $: { currency: "EUR" }, type: ["amount"] }], price: [{ $: { currency: "EUR" }, sale: ["1195.00"], retail: ["1195.00"] }], shipping: [{ cost: [{ $: { currency: "EUR" }, amount: ["0.00"], currency: ["EUR"] }], information: ["3–7 Werktage"], availability: ["in-stock"] }], attributeClass: [{ $: { class_id: "60" }, Product_Type: ["Motorcycle"], Size: ["36,38,40,42,44,46,48"], Material: ["Waxed Leather"], Color: ["Schwarz"], Gender: ["Female"], Age: ["Adult"] }] }],
    result = data.map(convert);

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


推荐阅读