循环以转换JavaScript对象

Loop to transform JavaScript object

本文关键字:对象 JavaScript 转换 循环      更新时间:2023-09-26

我正试图编写一个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);

你应该用英语写下你想做的事情。它可能看起来像这样:

  1. 创建一个新数组来保存结果
  2. 循环遍历对象的所有属性
  3. 对于每个属性,制作一个小对象,其唯一的键值对同时具有键和具有属性名称的值。将这个小对象添加到新数组中
  4. 但是,如果属性的值为对象,则对子对象重复整个过程
  5. 使用单个sleep属性创建一个结果对象,并将新数组作为其值

现在,你必须弄清楚如何完成每一步。例如,对于第二步,您需要知道如何查找对象的所有属性。你知道怎么做吗?你可以在谷歌上搜索"获取javascript对象的所有属性"。你会发现有一种叫做Object.keys()的东西。然后,你需要在这些键上循环。如果你不知道如何做到这一点,这里有一个很好的新教程。通读一遍是个好主意。

如何将键值对添加到对象中?这是非常基本的,在教程new_object[key] = key中也有介绍。

由于第4步有点难,所以在第一次迭代中跳过它,让程序只使用一个嵌套级别。

如果在执行此操作时遇到问题,则需要调试程序。这里有一个关于这个主题的好教程。

继续执行剩下的步骤,直到您拥有一个正常运行的JS程序。