繁体   English   中英

Javascript / Jquery JSON对象到对象内部的数组

[英]Javascript/Jquery JSON object to array inside object

我在此站点上看到了许多主题,但是每个主题都涉及单个Array。

我需要将每个对象转换为数字作为数组的键。

例如,我有一个类似的对象:

{
  "parent":{
    "0":{
      "child":false
    },
    "1":{
      "child":false
    },
    "4": {
      "child":false
    }
  }
}

我想

{
  "parent": [
    {
      "child":false
    },
    {
      "child":false
    },
    null,
    null,
    {
      "child":false
    }
  ]
}

这是一个例子,我的对象可以很深,并且可以容纳很多这样的对象,因此我需要一个泛型函数。

更新

我尝试使用@Nenad Vracar的代码进行测试:

function recursiveIteration(object) {
    var newob = {};
    for (var property in object) {
        if (object.hasOwnProperty(property)) {
            if (typeof object[property] == "object"){

                var result = {};
                var keys = Object.keys(object[property]);
                if ($.isNumeric(keys[0])) {
                                console.log("======> "+property+" is table");

                 for (var i = 0; i <= keys[keys.length - 1]; i++) {
                  if (keys.indexOf(i.toString()) != -1) {
                    result[property] = (result[property] || []).concat(object[property][i]);
                  } else {
                    result[property] = (result[property] || []).concat(null);
                  }
                                }
                                newob[property] = result;
                                 recursiveIteration(object[property]);
                        }       


                newob[property] = object[property];
                recursiveIteration(object[property]);
            }else{
                newob[property] = object[property];
            }
        }
    }
    return newob;
}

JSFiddle进行实时尝试

谢谢你们!

我认为这是您想要的:

var data = {
  "parent": {
    "0": {
      "child": false
    },
    "1": {
      "child": false
    },
    "4": {
      "child": false
    }
  }
};


var convert = function(data) {

  // not an object, return value
  if (data === null || typeof data !== 'object')
    return data;

  var indices = Object.keys(data);

  // convert children
  for (var i = 0; i < indices.length; i++)
    data[indices[i]] = convert(data[indices[i]]);

  // check if all indices are integers
  var isArray = true;
  for (var i = 0; i < indices.length; i++) {
    if (Math.floor(indices[i]) != indices[i] || !$.isNumeric(indices[i])) {
      isArray = false;
      break;
    }
  }

  // all are not integers
  if (!isArray) {
    return data;
  }
  // all are integers, convert to array
  else {
    var arr = [];
    for (var i = 0, n = Math.max.apply(null, indices); i <= n; i++) {
      if (indices.indexOf(i.toString()) === -1)
        arr.push(null);
      else
        arr.push(data[i]);
    }
    return arr;
  }

};

console.log( convert(data) );

这是一个工作的jsfiddle,其中包含您在更新中提供的数据。

您可以使用Object.keys()和一个for循环来完成此操作

 var data = {"parent":{"0":{"child":false},"1":{"child":false},"4":{"child":false}}}, result = {} var keys = Object.keys(data.parent); for (var i = 0; i <= keys[keys.length - 1]; i++) { if (keys.indexOf(i.toString()) != -1) { result.parent = (result.parent || []).concat(data.parent[i]); } else { result.parent = (result.parent || []).concat(null); } } console.log(result) 

您可以使用以下非常简单的递归Object方法来完成此工作。 对象结构中任何有效的嵌套对象(包括数组)都将转换为一个数组,其中的属性将替换为索引,而值将替换为项。

 Object.prototype.valueToItem = function(){ return Object.keys(this).map(e => typeof this[e] === "object" && this[e] !== null && !Array.isArray(this[e]) ? this[e].valueToItem() : this[e]); }; var o = { name: "terrible", lastname: "godenhorn", cars: ["red barchetta", "blue stingray"], age: 52, child: { name: "horrible", lastname: "godenhorn", cars: ["fiat 124", "tata"], age: 24, child:{ name: "badluck", lastname: "godenhorn", cars: ["lamborghini countach"], age: 2, child: null}}}, a = o.valueToItem(); console.log(a); 

可以修改OP的条件,但仍然尽可能地通用。

 Object.prototype.valueToItem = function(){ var keys = Object.keys(this); return keys.reduce((p,c) => typeof this[c] === "object" && this[c] !== null && !Array.isArray(this[c]) ? keys.every(k => Number.isInteger(k*1)) ? (p[c] = this[c].valueToItem(),p) : this[c].valueToItem() : this ,new Array(~~Math.max(...keys)).fill(null)); }; var o = { parent: { 0: { child : false }, 1: { child : false }, 4: { child : { 0: { child : false }, 3: { child : false }, 5: { child : false } } } } }; a = o.valueToItem(); console.log(JSON.stringify(a,null,4)); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM