复制/克隆JSON对象结构的最有效方法是什么?

时间:2014-03-03 12:07:46

标签: javascript json

我想这个标题非常简单。基本上我想要的是像mysqldump ... --no-data ...这样的东西。例如,我有一个像这样的json对象:

{ "key1" : "value1",
  "key2" : "value2",
  "key3" : {
      "key3a" : 1,
      "key3b" : 2
  },
  "key4" : "value3"
}

我想要的是和具有相同结构的空对象,如下所示:

{ "key1" : null,
  "key2" : null,
  "key3" : {
      "key3a" : null,
      "key3b" : null
  },
  "key4" : null
}

2 个答案:

答案 0 :(得分:1)

你想要的是什么类似于通常所谓的“深度克隆”,你似乎只想为不是对象的东西返回null。进行这种克隆的最简单方法是使用递归函数:

function deepAutomnClone(o){
  if (typeof o !== 'object') return null;
  var c = {};
  for (k in o) c[k] = deepAutomnClone(o[k]);
  return c;
}

你会这样称呼:

var obj = { "key1" : "value1",
  "key2" : "value2",
  "key3" : {
      "key3a" : 1,
      "key3b" : 2
  },
  "key4" : "value3"
};
console.log(deepAutomnClone(obj));

现在,你的问题不是很精确。您可能希望修改该函数,具体取决于所需的数组处理。

最后一件事:请注意,您拥有的不是“JSON对象”,因为JSON是基于文本的交换格式。这是一个普通的JavaScript对象。

答案 1 :(得分:0)

这是一个支持在对象之外重置阵列的解决方案。 它还可以避免将已经继承的对象的属性设置为null。

function cloneAndReset(obj) {

    var res = null;

    if (obj instanceof Array) {
        res = [];
        for (var i = 0; i < obj.length; i++) {
                res[i] = cloneAndReset(obj[i]);
        }
        return res;
    }

    if (obj instanceof Object) {
        res = {};
        for (p in obj) {
            if (obj.hasOwnProperty(p)) {                            
                res[p] = cloneAndReset(obj[p]);
            } 
        }
    } 

    return res;
}
相关问题