循环以转换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": {

我正试图编写一个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对象的结构(键和子对象)。有人能给我一个解决方案吗?

您可以使用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
    属性创建一个结果对象,并将新数组作为其值
  • 现在,你必须弄清楚如何做每一步。例如,对于第二步,您需要知道如何查找对象的所有属性。你知道怎么做吗?您可以在谷歌上搜索“获取javascript对象的所有属性”。你会发现有一个叫做
    Object.keys()
    的东西。然后,您需要在这些键上循环。如果你不知道怎么做,有一个很好的新教程刚刚发布。把它通读一遍是个好主意

    如何向对象添加键值对?这是非常基本的,教程中也有介绍:
    new\u object[key]=key

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

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


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

    您已经尝试过什么了吗?向我们展示您到目前为止为实现目标所做的工作。为什么要这样转换对象?这里没有JSON。这是一个普通的老JavaScript对象。所以我可以说明不断变化的模式真的不喜欢填鸭式代码。这取决于。有人可以复制粘贴它,有人可以通过分析代码来学习一些东西。这确实是一种理论上的可能性,尽管OP无法编写for循环预示着他从使用
    Object.keys
    、高阶函数(如
    map
    )和三元运算符的解决方案中学到了一些东西。我只是想知道SO的命运是否会继续是人们提出他们不知道如何解决的问题,而其他人为他们编写代码。公认的答案是比我冗长的嵌套for循环更优雅的解决方案。我从别人如何思考和处理问题中学到了很多@madox2显然比我更有经验,他提供的新颖方法对我这样的新手来说很有价值。这种偏见有帮助吗?还是你在寻求我不仅仅是懒惰的保证?不管怎样,我得到了一个很好的答案,@madox2大概得到了帮助一个新手的满足感,并为他的时间获得了一些适度的代表分数。我赞扬他花了一分钟的时间来帮助我,而不是告诉我去“谷歌搜索”,或者为这样的命运而哀叹。