【问题标题】:Prepending namespace to all of a JSON object's Keys为所有 JSON 对象的键添加命名空间
【发布时间】:2013-06-16 12:17:10
【问题描述】:

我对 JavaScript 的了解并不多,但这里是我正在尝试做的事情的概要。

我有一个由外部源准备的 JSON 对象。我按原样使用该对象将字符串连接到我准备好的另一个 JSON 对象,但问题是每个键前面都需要有一个命名空间缩写。

这就是我所拥有的:

obj1 = {
  "key1": "value",
  "key2": "value",
  "key3": "value",
  "key4": {
   "subkey1": "value",
   "subkey2": "value"
  }
}

我希望它变成什么:

obj1 = {
  "ns:key1": "value",
  "ns:key2": "value",
  "ns:key3": "value",
  "ns:key4": {
   "ns:subkey1": "value",
   "ns:subkey2": "value"
  }
}

这应该动态完成,因为这将用于同一项目的多个不同方面。所以我希望简单地有一个函数,我将'obj1'传入并让它吐出转换后的JSON对象,无论我给它什么。

解决此问题的最简单方法是什么?同样,我不习惯 JavaScript,所以欢迎提供示例。

附言。 CoffeeScript 解决方案也是可以接受的。我基本上是在 JS 中写出来,然后使用 js2coffee.org 进行转换。

【问题讨论】:

  • 你想改变对象还是创建它们的更改副本?
  • 好吧,for ... in 会让你遍历属性,所以这就是它的全部内容。如果您想“就地”进行更改,您需要添加一个新属性,然后添加 delete 旧属性。
  • "我正在使用该对象原样连接到我准备好的另一个 JSON 对象" - 你能告诉我们(通过代码)你在做什么到底是什么?
  • 在运行时的 JavaScript 代码上下文中确实没有“JSON 对象”这样的东西。您可以序列化到 JSON 或从 JSON 序列化,但是当您解析 JSON 时,您会得到一个纯 JavaScript 对象。
  • @Bergi 基本上我只是将 obj1 放入另一个使用 obj1 作为值的对象中。更大的Obj = {“ns:key”:“value”,“ns:key2”:obj1,“ns:key3”:“value”}

标签: javascript json coffeescript


【解决方案1】:

尝试检查代码,看看我是否遗漏了任何未处理的案例。在你使用它之前你必须检查一些东西我猜......

var obj1 = {
  "key1": "value",
  "key2": "value",
  "key3": "value",
  "key4": {
   "subkey1": "value",
   "subkey2": "value"
  }
};

var rename = function(obj, prefix){

    if(typeof obj !== 'object' || !obj){
        return false;    // check the obj argument somehow
    }

    var keys = Object.keys(obj),
        keysLen = keys.length,
        prefix = prefix || '';

    for(var i=0; i<keysLen ;i++){

        obj[prefix+keys[i]] = obj[keys[i]];
        if(typeof obj[keys[i]]=== 'object'){
            rename(obj[prefix+keys[i]],prefix);
        }
        delete obj[keys[i]];
    }

    return obj;
};

【讨论】:

    猜你喜欢
    • 2021-06-26
    • 2011-03-06
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 2014-07-18
    • 1970-01-01
    • 2010-09-13
    相关资源
    最近更新 更多