克隆JavaScript对象的最有效方法是什么?我已经看到obj = eval(uneval(o));
被使用,但这是非标准的,只有Firefox支持.
我做过类似的事情,obj = JSON.parse(JSON.stringify(o));
但质疑效率.
我也看到了具有各种缺陷的递归复制功能.
我很惊讶没有规范的解决方案.
我有一个对象,x
.我想把它复制为对象y
,这样改变y
就不要修改了x
.我意识到复制从内置JavaScript对象派生的对象将导致额外的,不需要的属性.这不是问题,因为我正在复制我自己的一个文字构造的对象.
如何正确克隆JavaScript对象?
我一直在学习node.js和模块,并且似乎无法使Underscore库正常工作......似乎我第一次使用Underscore中的函数时,它会覆盖_对象的结果我的函数调用.有谁知道发生了什么?例如,这是来自node.js REPL的会话:
Admin-MacBook-Pro:test admin$ node
> require("./underscore-min")
{ [Function]
_: [Circular],
VERSION: '1.1.4',
forEach: [Function],
each: [Function],
map: [Function],
inject: [Function],
(...more functions...)
templateSettings: { evaluate: /<%([\s\S]+?)%>/g, interpolate: /<%=([\s\S]+?)%>/g },
template: [Function] }
> _.max([1,2,3])
3
> _.max([4,5,6])
TypeError: Object 3 has no method 'max'
at [object Context]:1:3
at Interface.<anonymous> (repl.js:171:22)
at Interface.emit (events.js:64:17)
at Interface._onLine (readline.js:153:10)
at Interface._line (readline.js:408:8)
at Interface._ttyWrite (readline.js:585:14)
at ReadStream.<anonymous> (readline.js:73:12)
at ReadStream.emit (events.js:81:20)
at ReadStream._emitKey (tty_posix.js:307:10)
at ReadStream.onData (tty_posix.js:70:12)
> _
3
Run Code Online (Sandbox Code Playgroud)
当我自己制作Javascript文件并导入它们时,它们似乎正常工作.也许Underscore图书馆有一些特别的东西?
我有多个JSON
这样的人
var object1 = {name: "John"};
var object2 = {location: "San Jose"};
Run Code Online (Sandbox Code Playgroud)
它们不是嵌套或类似的东西.只是基本不同的领域.我需要将它们组合成node.js中的一个单独JSON
的像这样:
{name: "John", location: "San Jose"}
Run Code Online (Sandbox Code Playgroud)
我可以使用jQuery就好了.以下是浏览器中的一个工作示例:
http://jsfiddle.net/qhoc/agp54/
但是如果我在node.js中这样做,我不想加载jQuery(这有点过度使用,加上node.js'jQuery在我的Windows机器上不起作用).
那么有一种简单的方法可以在$.extend()
没有jQuery的情况下做类似的事情吗?
我有一个node.js + express应用程序,我用npm安装了jQuery.
在app.js
我使用的文件中
var jquery = require('jquery');
Run Code Online (Sandbox Code Playgroud)
在html文件头中我包含了使用jQuery的javascript,我得到了"jQuery未定义".这是订单还是我错过了什么?
我想知道为什么会这样?
我有一个存储在var myObj中的json对象:
var myObj = JSON.parse(fs.readFileSync('json/data.json', 'utf8'));
Run Code Online (Sandbox Code Playgroud)
然后我通过以下方式从原始对象中获取克隆:
var modObj = myObj;
Run Code Online (Sandbox Code Playgroud)
之后我从clone中删除空值:
cleansedObj = removeEmpty(modObj);
Run Code Online (Sandbox Code Playgroud)
为什么这也会改变原始的myObj并从中删除空值?
这是功能:
function removeEmpty(obj) {
Object.keys(obj).forEach(function(key) {
if (obj[key] && typeof obj[key] === 'object') removeEmpty(obj[key])
else if (obj[key] === "") delete obj[key]
});
return obj;
};
Run Code Online (Sandbox Code Playgroud)
我通过这样做找到了一种解决方法,但似乎是不成功的操作:
var cleansedObj = JSON.stringify(myObj);
cleansedObj = removeEmpty(JSON.parse(cleansedObj));
Run Code Online (Sandbox Code Playgroud)
谢谢!