javascript - 将像数组一样的对象属性转换为数组不起作用
问题描述
我有一个嵌套对象,如下所示(它可以有任何深度):
{
"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
}
}
解决方案
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);
推荐阅读
- java - 如何将代码从一个项目共享到另一个项目并控制将编译到 JAR 文件的内容?
- vba - 从图表中提取形状
- javascript - 循环、显示和数组
- javascript - 填充数组后的空元素
- javascript - 如何从数组 json 对象访问值 - javascript
- c# - 将 Newtonsoft JSON 序列化为字节数组
- javascript - Servicenow中uDeploy部署的输入格式
- java - 尝试在空对象引用上调用虚拟方法“boolean android.media.MediaPlayer.isPlaying()”
- python - 如何使用 python 处理 systemctl 命令
- python - 根据 pandas 中的参数将列的值更改为 1 或 0