我在想如何创建一个JSON (JS)对象,然后对它进行克隆。
这就是我所做的事情,而且它的效果非常好。
if (typeof JSON.clone !== "function") {
JSON.clone = function(obj) {
return JSON.parse(JSON.stringify(obj));
};
}
只需要去做。
var x = {} //some json object here
var y = JSON.parse(JSON.stringify(x)); //new json object here
从ES6开始,Object.assign是一个很好的方法来做到这一点。
newjsonobj = Object.assign({}, jsonobj, {})
第一个参数中的项目会改变现有对象,第三个参数是返回的新对象中的更改。
在ES7中,建议使用展开运算符。
newjsonobj = {...jsonobj}
var a = {arr:[1,2,3]}; var b = Object.assign({}, a, {}); b.arr[0] = 4; console.log(a.arr);
输出的结果是 [4, 2, 3]
,而不是预期的 [1, 2, 3]
。 - thenickdude当我解析JSON并在代码中多次重用它时,经常遇到的问题是如何避免每次都从原始JSON字符串重新解析,或者采用serialize/parse
方式,这种方式效率较低。
因此,在这些情况下,如果您想要调整已解析的对象但仍保持原始对象不变,请在服务器(NodeJs)或客户端JavaScript代码中使用以下函数。jQuery clone
函数效率较低,因为它们处理函数、正则表达式等情况。下面的函数仅处理JSON支持的类型(null、undefined、number、string、array和object):
function cloneJSON(obj) {
// basic type deep copy
if (obj === null || obj === undefined || typeof obj !== 'object') {
return obj
}
// array deep copy
if (obj instanceof Array) {
var cloneA = [];
for (var i = 0; i < obj.length; ++i) {
cloneA[i] = cloneJSON(obj[i]);
}
return cloneA;
}
// object deep copy
var cloneO = {};
for (var i in obj) {
cloneO[i] = cloneJSON(obj[i]);
}
return cloneO;
}
问题1: 如何在Javascript/jQuery中创建JSON对象?
创建Javascript对象非常简单:
var user = {}; // creates an empty user object
var user = {firstName:"John", lastName:"Doe"}; // creates a user by initializing
// its firstName and lastName properties.
user.age = 30;
。JSON.parse(yourJsonString)
函数或jQuery的 $.parseJSON(yourJsonString)
函数将其转换为JSON对象。
Q2: 如何在javascript/jquery中克隆JSON对象?var cloneUser = $.extend(true, {}, {firstName:"John", lastName:"Doe"});
第一个参数确定克隆对象是原始对象的浅拷贝还是深拷贝(参见维基百科上的对象复制)。
要查看其他JSON克隆替代方案,请阅读此文章。
JSON.parse
返回一个 Object
(参见:MDN),而不是所谓的“JSON对象”,据我所知,这种对象并不存在。(不是挑刺,但这是许多初学者困惑的一个点,因此纠正一下可能会有好处) - StubbornShowaGuyvar jsonString2 = jsonString;
我无法再使用JavaScript数组了
JSON是一种用于交换数据的格式,它不是您可以在应用程序中使用的数据结构。
foo = {"x":"y"}; bar= foo; bar.x = "z"; console.log("Foo: "+foo.x+" | Bar: "+bar.x")
,结果两个都变成了 z
。我们是在谈论包含JSON格式数据的字符串对象还是JSON对象? - MatthewEmployeeDetails =
{
Name:"John Deer",
Age:29,
Company:"ABC Limited."
}
function clonning(Employee)
{
// conversion from Object to String
var EmployeeString = JSON.stringify(Employee);
// conversion from String to Object type
var EmployeeConvertedObject = JSON.parse(EmployeeString);
// printing before changing prperty value.
console.log(EmployeeConvertedObject);
// modifying EmployeeConvertedObject property value
EmployeeConvertedObject.Name="Kelvin Bob";
// printing After changing prperty value.
console.log(EmployeeConvertedObject);
// Now printing original json object.
console.log(Employee);
// Here original JSON object is not affecting. Only Cloned object affecting.
}
clonning(EmployeeDetails);
结果:
clonning(EmployeeDetails)
VM212:22 {Name: "John Deer", Age: 29, Company: "ABC Limited."}
VM212:30 {Name: "Kelvin Bob", Age: 29, Company: "ABC Limited."}
VM212:34 {Name: "John Deer", Age: 29, Company: "ABC Limited."}
JSONOBJECT clone_EmailData=new JSONOBJECT(EmailData.toString());
上述语句将为您提供一个具有相同数据的新对象,而这个新对象不是对EmailData对象的引用。