[英]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.