循环以转换JavaScript对象
Loop to transform JavaScript object
我正试图编写一个JavaScript循环来转换我的JavaScript对象,
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对象的结构(键和子对象)。有人能给我一个解决方案吗?
简单的解决方案:
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);
您可以使用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);
你应该用英语写下你想做的事情。它可能看起来像这样:
- 创建一个新数组来保存结果
- 循环遍历对象的所有属性
- 对于每个属性,制作一个小对象,其唯一的键值对同时具有键和具有属性名称的值。将这个小对象添加到新数组中
- 但是,如果属性的值为对象,则对子对象重复整个过程
- 使用单个
sleep
属性创建一个结果对象,并将新数组作为其值
现在,你必须弄清楚如何完成每一步。例如,对于第二步,您需要知道如何查找对象的所有属性。你知道怎么做吗?你可以在谷歌上搜索"获取javascript对象的所有属性"。你会发现有一种叫做Object.keys()
的东西。然后,你需要在这些键上循环。如果你不知道如何做到这一点,这里有一个很好的新教程。通读一遍是个好主意。
如何将键值对添加到对象中?这是非常基本的,在教程new_object[key] = key
中也有介绍。
由于第4步有点难,所以在第一次迭代中跳过它,让程序只使用一个嵌套级别。
如果在执行此操作时遇到问题,则需要调试程序。这里有一个关于这个主题的好教程。
继续执行剩下的步骤,直到您拥有一个正常运行的JS程序。
相关文章:
- 面向对象JavaScript中的私有函数
- 对象 Javascript 中的标签无效 - 想要添加事件列表器
- 将字符串转换为对象 javascript/jquery
- 正在检查对象javascript中是否存在嵌套属性
- 时间-日期对象JavaScript getUTCMilliseconds
- 仅在对象(javascript)中解析值
- 使用对象(JavaScript或jQuery)填充选择下拉列表
- 引用另一个对象javascript中的对象
- 如何删除列表中的对象?Javascript nodejs和下划线
- 无法从日期对象javascript获取日期和月份
- 如何在if语句中使用对象-Javascript
- 对象javascript错误
- 对象Javascript的少数实例
- 位置对象Javascript
- 将字符串传递到对象javascript中
- 获取对象Javascript或jQuery的最后一个值
- 鼠标接近对象Javascript
- 这个mixins代码是书中的错误吗;面向对象JavaScript的原理”;
- 使用闭包编译器编写更好的面向对象JavaScript完整示例代码
- 访问对象javascript数组中的对象属性值