循环以转换JavaScript对象
我正试图编写一个JavaScript循环来转换我的JavaScript对象循环以转换JavaScript对象,javascript,for-loop,Javascript,For Loop,我正试图编写一个JavaScript循环来转换我的JavaScript对象 var d = { "time_completed": 1420199657, "xid": "-dqAeAEjGxCDcjqrxHsraER3yWqew4xS", "title": "for 8h 46m", "time_created": 1420167382, "time_updated": 1420200033, "details": {
var d = {
"time_completed": 1420199657,
"xid": "-dqAeAEjGxCDcjqrxHsraER3yWqew4xS",
"title": "for 8h 46m",
"time_created": 1420167382,
"time_updated": 1420200033,
"details": {
"body": 0,
"sound": 12598,
"tz": "America/Chicago",
"awakenings": 0,
"light": 18970,
"mind": 0,
"asleep_time": 1420168079,
"awake_time": 1420199400,
"awake": 707,
"rem": 0,
"duration": 32275,
"smart_alarm_fire": 1420199640,
"quality": 100,
"sunset": 0,
"sunrise": 0
},
"date": 20150102,
"shared": true,
"snapshot_image": "/nudge/image/e/1420200033/-dqAeAEjGxCDcjqrxHsraER3yWqew4xS/MSh0lOvjHDY.png",
"sub_type": 0
};
对此,
var d = {"sleep":[
{"time_completed":"time_completed"},
{"xid":"xid"},
{"title":"title"},
{"time_created":"time_created"},
{"time_updated":"time_updated"},
{"details": [
{"body":"body"},
{"sound":"sound"},
{"tz":"tz"},
{"awakenings":"awakenings"},
{"light":"light"},
{"mind":"mind"},
{"asleep_time":"asleep_time"},
{"awake_time":"awake_time"},
{"awake":"awake"},
{"rem":"rem"},
{"duration":"duration"},
{"smart_alarm_fire":"smart_alarm_fire"},
{"quality":"quality"},
{"sunset":"sunset"},
{"sunrise":"sunrise"}
]},
{"date":"date"},
{"shared":"shared"},
{"snapshot_image":"snapshot_image"},
{"sub_type":"sub_type"}
]};
d
对象并不总是具有相同的元素(关键点)或深度(子项)。因此,我试图提出一个简单的循环来提取JavaScript对象的结构(键和子对象)。有人能给我一个解决方案吗?您可以使用Object.keys()和递归来迭代(嵌套)对象属性,并使用Array.prototype.map()来转换它:
function mapKeys(obj) {
return Object.keys(obj).map(function(key) {
var newObj = {};
newObj[key] = (typeof obj[key] === 'object') ? mapKeys(obj[key]) : key;
return newObj;
});
}
var result = {
sleep: mapKeys(d)
};
console.log(result);
简单解决方案:
var transformed = {};
function transform(obj){
var arr = [], prop, inner_obj;
for(prop in obj){
inner_obj = {};
inner_obj[prop] = (typeof obj[prop] === 'object')? transform(obj[prop]) : obj[prop];
arr.push(inner_obj);
}
return arr;
}
transformed['sleep'] = transform(d);
console.log(transformed);
你应该用英语写下你想做的事。它可能看起来像这样:
sleep
属性创建一个结果对象,并将新数组作为其值Object.keys()
的东西。然后,您需要在这些键上循环。如果你不知道怎么做,有一个很好的新教程刚刚发布。把它通读一遍是个好主意
如何向对象添加键值对?这是非常基本的,教程中也有介绍:new\u object[key]=key
因为步骤4有点难,所以在第一次迭代中跳过它,让程序只使用一个嵌套级别
如果在执行此操作时遇到问题,则需要调试程序。关于这个话题有一个很好的教程
继续执行剩余步骤,直到您有一个正常运行的JS程序。您已经尝试过什么了吗?向我们展示您到目前为止为实现目标所做的工作。为什么要这样转换对象?这里没有JSON。这是一个普通的老JavaScript对象。所以我可以说明不断变化的模式真的不喜欢填鸭式代码。这取决于。有人可以复制粘贴它,有人可以通过分析代码来学习一些东西。这确实是一种理论上的可能性,尽管OP无法编写for循环预示着他从使用
Object.keys
、高阶函数(如map
)和三元运算符的解决方案中学到了一些东西。我只是想知道SO的命运是否会继续是人们提出他们不知道如何解决的问题,而其他人为他们编写代码。公认的答案是比我冗长的嵌套for循环更优雅的解决方案。我从别人如何思考和处理问题中学到了很多@madox2显然比我更有经验,他提供的新颖方法对我这样的新手来说很有价值。这种偏见有帮助吗?还是你在寻求我不仅仅是懒惰的保证?不管怎样,我得到了一个很好的答案,@madox2大概得到了帮助一个新手的满足感,并为他的时间获得了一些适度的代表分数。我赞扬他花了一分钟的时间来帮助我,而不是告诉我去“谷歌搜索”,或者为这样的命运而哀叹。