出于某些奇怪的原因,当这个数据:
// data
visitorsTemplate: [{
text: '',
type: 'buttons',
children: [{
name: 'email',
method: (e) => { this.sendEmail(e) }
}]
}]
克隆:
// watch
console.log(this.visitorsTemplate)
const visitorItem = clone(this.visitorsTemplate)
console.log(visitorItem)
使用此功能:
// utils
export const clone = (...args) => {
return JSON.parse(JSON.stringify.apply(null, args))
}
方法属性消失。以下是console.logs
:
[{
text: "",
type: "buttons",
children": [{
name: "email",
method: f method(e)
}, {
name: "delete",
method: f method(e)
}]
}]
[{
text: "",
type: "buttons",
children": [{
name: "email"
}, {
name: "delete"
}]
}]
更新:我发现JSON.stringify正在移除methods
,但我需要创建一个新数组。那么如何避免删除方法?
答案 0 :(得分:2)
您可以实现自己的对象深度克隆实现。试试这段代码。
function deepcloneObject(obj) {
var clone = {};
for(var i in obj) {
if(obj[i] != null && typeof(obj[i])=="object")
clone[i] = deepcloneObject(obj[i]);
else
clone[i] = obj[i];
}
return clone;
}
答案 1 :(得分:1)
当你执行JSON.stringify时,他们将尝试创建一个JSON对象的字符串。当你在里面有方法时,它也会尝试转换为字符串。
因此,如果您想拥有一个新的对象实例,可以使用它:http://underscorejs.org/#clone
newObject = _.clone(visitor)
或者如果您希望以后能够以编程方式创建,请准备以下内容:
function Visitor(){
return {
text: '',
type: 'buttons',
children: [Child()]
}
}
function Child(){
return {
name: 'email',
method: (e) => { this.sendEmail(e) }
}
}
答案 2 :(得分:1)
使用Object.assign
和Array.prototype.map
const clonedArray = array.map(a => Object.assign({}, a));
答案 3 :(得分:1)