【问题标题】:Flatten nested JSON second level only仅展平嵌套的 JSON 二级
【发布时间】:2021-11-25 10:37:16
【问题描述】:

我的 JSON 结构是这样的

var data = var data = [{"id": 451, "title": {    "rendered": "title1" }, "acf": {    "floor": "6",    "business": [       "business"    ],    "status": {       "value": "null",       "label": "Määramata"    },    "suund": "",    "area": {       "value": "full",       "label": "Terve korrus"       },       "suurus": "",       "tookohad": "",    }, },]; 

我需要将 acf 展平才能在没有 acf 嵌套的情况下得到它。

var data = [
  {
"id": 451,
"title": {
   "rendered": "Title 1"
},
   "floor": "6",
   "business": [
      "business"
   ],
   "status": {
      "value": "null",
      "label": "Määramata"
   },
   "suund": "",
   "area": {
      "value": "full",
      "label": "Full"
      },
      "size": "",
},
];

我尝试使用这个功能

function flat(source, target) {
Object.keys(source).forEach(function (k) {
    if (source[k]!== null && typeof source[k] === 'object') {
        flat(source[k], target);
        return;
    }
    target[k] = source[k];
});flatObject = {};flat(data, flatObject);console.log(flatObject);

但它会使一切变平。我需要从 acf 中挑选一些东西,但要保持带有 id 的元素分开。

【问题讨论】:

    标签: javascript json flatten


    【解决方案1】:

    据我了解,您想要实现的是: (我改进了示例,以便您甚至可以在对象数组上工作)

    var data = [{"id": 451, "title": {    "rendered": "title1" }, "acf": {    "floor": "6",    "business": [       "business"    ],    "status": {       "value": "null",       "label": "Määramata"    },    "suund": "",    "area": {       "value": "full",       "label": "Terve korrus"       },       "suurus": "",       "tookohad": "",    }, },]; 
    
    function flat(source) {
      let result = source.map(el => {
        let noAcf = {}
        Object.keys(el).forEach(key => {
          if(key === "acf"){
            noAcf = {...noAcf, ...el[key]}
          } else {
            noAcf[key]=el[key]
          }
        })
        return noAcf
      })
      return result
    }
    
    
    const flatObjectsList = flat(data);
    console.log(flatObjectsList);

    【讨论】:

      【解决方案2】:

      您可以执行以下操作:

      const flattenData = {
        ...data,
        acf: undefined,
        ...data.acf
      };
      delete flattenData['acf'];
      

      这个方法链接了一些destructuring assignments。首先 - ...data - 我们复制第一级中的所有数据。然后在新对象中,我们用undefined 覆盖acf。这减少了内存占用。最后我们覆盖/复制data.acf的完整对象,从而以你想要的方式展平数组。

      如果您可以使用数组中的acf: undefined,则可以删除delete flattenData['acf'] 并使其更快一些。

      【讨论】:

        猜你喜欢
        • 2018-12-23
        • 2016-10-06
        • 2021-09-05
        • 1970-01-01
        • 2021-07-14
        • 2021-10-19
        • 2012-05-29
        • 2014-08-29
        • 2020-03-08
        相关资源
        最近更新 更多