首页 > 解决方案 > 将像数组一样的对象属性转换为数组不起作用

问题描述

我有一个嵌套对象,如下所示(它可以有任何深度):

{
    "a": 5,
    "b": {
        "0": 1,
        "1": "x"
    },
    "x": {
        "a": 1,
        "1": "z"
    },
    "c": {
        "0": 3,
        "1": "Am",
        "3":{
            "0": 3,
            "1": "x",
            "2":{
                "0": 3,
                "1": "Y"
            },
            "length": 3
        },
        "length": 4
    }
}

我必须将其转换如下(对象可能有也可能没有长度属性):

{
    "a": 5,
    "x": {
        "a": 1,
        "1": "z"
    },
    "b": [1,"x"],
    "c": [3, "Am",undefind, [ 3, "x", [ 3, "Y" ] ] ]
}

我写了如下方法:

function formatObjToArr(obj) {
    var kys = Object.keys(obj);
    var isObj = (/[^0-9]/g).test(kys.join('')) && !Array.isArray(obj);
    if(!isObj){
        obj.length===undefined && (obj.length = Math.max.apply(null,kys.map(function (i) { return parseInt(i) }))+1);
        obj = Array.prototype.map.apply(obj,[function (i) { return i}]);
        obj.forEach(function (i) {
            (typeof i === "object" && i!==null) && formetObjToArr(i);
        })
    }else {
        for (var property in obj) {
            if (obj.hasOwnProperty(property) && property!=='length') {
                if (typeof obj[property] === "object" && obj[property]!==null) {
                    formetObjToArr(obj[property]);
                }
            }
        }
    }
}

但它只是添加了长度属性,并没有改变类型。我的代码输出如下:

{
  "a": 5,
  "b": {
      "0": 1,
      "1": "x",
      "length": 2
   },
  "x": {
      "a": 1,
      "1": "z"
  },
  "c": {
      "0": 3,
      "1": "Am",
      "3": {
          "0": 3,
          "1": "x",
          "2": {
              "0": 3,
              "1": "Y",
              "length": 2
          },
          "length": 3
      },
      "length": 4
  }
}

标签: javascriptarraysobject

解决方案


var data = {
    "a": 5,
    "b": {
        "0": 1,
        "1": "x"
    },
    "c": {
        "0": 3,
        "1": "Am",
        "length": 2
    }
}


for(const d in data){
    if(typeof data[d] === 'object'){
        delete data[d]['length'];
        data[d] = Object.values(data[d]);
    }
}

console.log(data);

推荐阅读