首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在JavaScript中展平JSON对象

在JavaScript中展平JSON对象
EN

Stack Overflow用户
提问于 2020-04-18 16:52:08
回答 2查看 92关注 0票数 0

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

在我的例子中,条件是if object === "$"

我还需要将一些数组展平为仅字符串。管理这种情况的最好方法是什么?有什么建议吗?

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

JSON响应为:

代码语言:javascript
复制
[
   {
      "$":{
         "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"
            ]
         }
      ]
   },
   ...
]

我想要

代码语言:javascript
复制
[
   {
      "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"
      }
   },
   ...
]

我尝试过的:

代码语言:javascript
复制
const flatJson = async data => {
  try {
    const newData = await Promise.all(json.map( async (item, i) => {
      xxx
    }));
    return newData
  }
  catch(err) {
    console.log(err)
  }
};
EN

回答 2

Stack Overflow用户

发布于 2020-04-18 17:39:44

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

代码语言:javascript
复制
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);
代码语言:javascript
复制
.as-console-wrapper { max-height: 100% !important; top: 0; }

票数 1
EN

Stack Overflow用户

发布于 2020-04-18 17:34:36

您可以尝试此递归代码

代码语言:javascript
复制
function recurseData(data, level) {
    var newdata = {};
    for(var prop in data) {
        if( data[prop].constructor == Object && prop=="$") {
            var data1 = recurseData(data[prop], level+1);
            for(var prop1 in data1)
                newdata[prop1] = data1[prop1];
        }
        else if(data[prop].constructor == Object){
            newdata[prop] = recurseData(data[prop],level+1);
        }
        else if(data[prop].constructor == Array && level > 0 && data[prop][0].constructor != Object && data[prop].length==1){
            newdata[prop] = data[prop][0];
        }
        else if(data[prop].constructor == Array) {
            newdata[prop] = [];
            for(var i=0;i<data[prop].length;i++)
                newdata[prop].push( recurseData(data[prop][i],level+1) );
        }
        else if(prop!="$")
            newdata[prop] = data[prop];
    }
    return newdata;
}

data[0] = recurseData(data[0], 0);

简单地循环遍历所有树结构并检测关键字$

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61286499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档