【问题标题】:parse nested JSON Data [duplicate]解析嵌套的 JSON 数据 [重复]
【发布时间】:2018-10-17 19:50:38
【问题描述】:

我是 Javascript 和 ES6 的新手,我遇到了这个问题

这是我从网络服务获取的 JSON

{
  "products": [
    {
      "id": 2,
      "id_default_image": "21",
      "price": "35.900000",
      "name": [
        {
          "id": "1",
          "value": "item 1"
        },
        {
          "id": "2",
          "value": "item 1 alternate name"
        }
      ]
    },
    {
      "id": 4,
      "id_default_image": "4",
      "price": "29.000000",
      "name": [
        {
          "id": "1",
          "value": "item 2"
        },
        {
          "id": "2",
          "value": "item 2 alternate name"
        }
      ]
    }
  ]
}

上述 JSON 中的 name 属性是一个数组,我只需要第一个元素的值。所需的输出如下所示

{
  "products": [
    {
      "id": 2,
      "id_default_image": "21",
      "price": "35.900000",
      "name": "item 1"
    },
    {
      "id": 4,
      "id_default_image": "4",
      "price": "29.000000",
      "name": "item 2"
    }
  ]
}

我正在开发一个 react-native 项目。实现这一目标的最简单方法是什么?任何帮助将不胜感激。谢谢。

【问题讨论】:

  • 欢迎来到 SO!我鼓励您阅读how to ask a good question 并编辑您的问题。否决票背后的原因很可能是您没有提供任何尝试自己解决问题。向我们展示您的代码并解释您遇到的任何问题或错误。
  • edit您的问题并添加您已经尝试过的内容。
  • 欢迎来到 SO。目前尚不清楚您将如何使用此数据突变。正如你所看到的,一些提供的答案已经改变了数据,如果你将在你的状态下使用这些数据,我不鼓励你使用这些建议。这就是为什么人们试图引导你更好地提出你的问题。我还从问题中删除了reactjs 标签,因为它与当前状态下的reactjs 无关。所以,如果你编辑你的问题并提供一些细节,如果它与react有关,你/我们可以再次添加这个标签。

标签: javascript json


【解决方案1】:

与 Ele 的回答类似,但如果您不想更改原始对象。您可以使用map 遍历产品对象并返回一个新的产品数组:

const data = {"products":[{"id":2,"id_default_image":"21","price":"35.900000","name":[{"id":"1","value":"item 1"},{"id":"2","value":"item 1 alternate name"}]},{"id":4,"id_default_image":"4","price":"29.000000","name":[{"id":"1","value":"item 2"},{"id":"2","value":"item 2 alternate name"}]}]};

const products = data.products.map(obj => ({ ...obj, name: obj.name[0].value }));

console.log(products);

也用过:spread syntax

【讨论】:

    【解决方案2】:

    好吧,您可以使用函数forEach 或简单的for-loop 并将第一个值分配给属性name

    let obj = {  "products": [    {      "id": 2,      "id_default_image": "21",      "price": "35.900000",      "name": [        {          "id": "1",          "value": "item 1"        },        {          "id": "2",          "value": "item 1 alternate name"        }      ]    },    {      "id": 4,      "id_default_image": "4",      "price": "29.000000",      "name": [        {          "id": "1",          "value": "item 2"        },        {          "id": "2",          "value": "item 2 alternate name"        }      ]    }  ]}
    
    obj.products.forEach(o => (o.name = o.name[0].value));
    
    console.log(obj);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

    • 请问您为什么恢复编辑?如果您想将"" 保留在对象属性中,我可以理解(尽管我们在这里不需要它们)但至少您为什么不保留格式?您的代码与当前形状相比非常难看。
    • @devserkan 我部分同意,但是,这里的目的是解决方案而不是格式。
    • 当然 OP 可以在这里很容易地看到解决方案,但有人已经编辑了代码以获得更好的格式。为什么要回归?只是一个反问,我已经有了答案……
    • @devserkan 行太多。
    【解决方案3】:

    试试这个

     const productsArray = products.map((product, index) => {
       const obj = {};
       obj["id"] = product["id"];
       obj["id_default_image"] = product["id_default_image"];
       obj["price"] = product["price"],
      obj["name"] = product.name[0].value;
      return obj;
    });
    
     const obj = {};
     obj.products = productsArray;
    
     console.log(obj);//will print you the desired output you want
    

    【讨论】:

    • 那里缺少一些括号。 ( product, index ) 用于映射参数,一个用于products.map 的结束部分。 });
    猜你喜欢
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    • 1970-01-01
    • 1970-01-01
    • 2021-05-06
    • 2018-07-15
    相关资源
    最近更新 更多