【问题标题】:In JSON Object parent key name remove and Include its inner content在 JSON 对象父键名中删除并包含其内部内容
【发布时间】:2016-03-11 10:36:55
【问题描述】:

这是我的 JSON 对象,我想从 json 中删除“item”键,并希望将其内部对象包含在“children”和它的树中,如 JOSN。我怎样才能做到这一点?

[
    {
      "item": {
        "id": 11865,
        "parentid": null,
        "levelid": 63,
        "name": "Total"
      },
      "children": [
        {
          "item": {
            "id": 10143,
            "parentid": 11865,
            "levelid": 19,
            "name": "Productive"
          }
        }
      ]
    }
  ]

【问题讨论】:

标签: javascript arrays json


【解决方案1】:

如果我理解您希望您的对象正确后的样子,那么这应该可以解决问题:

var arrayOfObjects = [
    {
      "item": {
        "id": 11865,
        "parentid": null,
        "levelid": 63,
        "name": "Total"
      },
      "children": [
        {
          "item": {
            "id": 10143,
            "parentid": 11865,
            "levelid": 19,
            "name": "Productive"
          }
        }
      ]
    }
]
arrayOfObjects.forEach(function(obj) {
  obj.id = obj.item.id;
  obj.parentid = obj.item.parentid;
  obj.levelid = obj.item.levelid;
  obj.name = obj.item.name;
  delete obj.item;
});

所有这一切都是手动将数据从obj.item 移动到obj,然后完全删除obj.item

【讨论】:

    【解决方案2】:

    我会这样做:

    //your original array of objects
    var array = [{
      "item": {
        "id": 11865,
        "parentid": null,
        "levelid": 63,
        "name": "Total"
      },
      "children": [
        {
          "item": {
            "id": 10143,
            "parentid": 11865,
            "levelid": 19,
            "name": "Productive"
          }
        }
      ]
    }, ...];
    
    array.forEach(function(parent) {
        flattenKey(parent, 'item');
    });
    
    function flattenKey(parent, keyName) {
        var section = parent[keyName];
        var child = section ? section : {};
        var keys = Object.keys(child);
        keys.forEach(function(key) {
            parent[key] = child[key];
        })
        delete parent[keyName];
    }
    

    基本上,flattenKey 函数会展平给定对象的任何键(给定它的键)。

    1. 逻辑与此处的其他解决方案类似:遍历子键并将其值分配给父对象(展平)。
    2. 然后它会在步骤 1 之后删除子密钥。

    【讨论】:

      【解决方案3】:

      试试

      objArray = objArray.map( function(value){ 
         var item = value.item; 
         for( var key in item ) 
         { 
           value[key] = item[key]; 
         } 
         delete value.item; 
         return value;
      });
      

      DEMO

      说明

      1) 使用 map 迭代此给定数组 objArray 的每个项目 (value)。

      2) 获取valueitem属性,直接赋值给value

      3) 最后删除valueitem属性。

      更快的选择

      objArray = objArray.map( function(value){ 
         var item = value.item; 
         var itemKeys = Object.keys(item); 
         for( var counter = 0; counter < itemKeys.length; counter++ ) 
         { 
           value[itemKeys[counter]] = item[itemKeys[counter]]; 
         } 
         delete value.item; 
         return value;
      });
      

      【讨论】:

      • 会在父原型中查询属性吗?从效率的角度来看,Object.keys() 更好?
      • @82Tuskers 不确定在这种情况下我是否看到了巨大的好处,因为属性的数量非常少。无论如何都会用其他选项更新答案,因为.keys 似乎更快jsperf.com/object-keys-foreach-vs-for-in-hasownproperty/8
      • 是的 .. 问题不在于用户对象,而在于主机对象。用户对象将在其原型链中包含它。
      【解决方案4】:

      您可以使用递归,保留item 的内容并添加children 属性。

      function delItem(a, i, aa) {
          var children = a.children;
          if (a.item) {
              aa[i] = a.item;
              aa[i].children = children;
              delete a.item;
          }
          Array.isArray(children) && children.forEach(delItem);
      }
      
      var array = [{ "item": { "id": 11865, "parentid": null, "levelid": 63, "name": "Total" }, "children": [{ "item": { "id": 10143, "parentid": 11865, "levelid": 19, "name": "Productive" } }] }];
      array.forEach(delItem);
      document.write('<pre>' + JSON.stringify(array, 0, 4) + '</pre>');

      【讨论】:

        猜你喜欢
        • 2020-07-29
        • 1970-01-01
        • 2017-11-20
        • 2017-11-16
        • 1970-01-01
        • 2020-02-18
        • 2016-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多