2017-04-27 140 views
0

我有一个deepClone函数,我使用整个程序克隆一个对象的所有属性和值,并返回克隆的对象(看代码)。我现在想要在对象中包含一个audioBuffer并成功将其复制到返回对象。有没有办法修改函数来包含这个功能?网络音频API - 克隆音频缓冲区

注意:并非所有传递给deepClone函数的对象都会包含audioBuffer,因此它应该能够应对并成功克隆具有和不具有它们的对象。

编辑:有人能想出一种方法将JSON.parse(JSON.stringify(object))与作为答案之一提供的解决方案相结合吗?即检查对象的属性,因为克隆正在发生,if (property == 'trackBuffer')克隆与其余的不同?

deepClone功能:

function deepClone (object) { 
    return JSON.parse(JSON.stringify(object)); 
}; 

/** 
 
* Utility function for deep object cloning 
 
*                                            
 
* @param {object} obj Object to be cloned 
 
* @returns {object}  The deep-cloned object 
 
*/ 
 
function deepClone (object) { 
 
    return JSON.parse(JSON.stringify(object)); 
 
}; 
 

 
// Create audio context 
 
var context = new AudioContext(); 
 

 
// Create empty audio buffer 
 
var audioBuffer = context.createBuffer(2, 22050, 44100); 
 

 
// Create object to be cloned 
 
var track = { 
 
    prop1: "val1", 
 
    prop2: "val2", 
 
    trackBuffer: audioBuffer 
 
}; 
 

 
// Log before clone 
 
console.log("before clone, track: \n", track); 
 

 
// Clone track 
 
var clonedTrack = deepClone(track); 
 

 
// Log after clone 
 
console.log("after clone, clonedTrack: \n", clonedTrack);

正如可以从代码段,请参阅clonedTracktrackBuffer被转换为一个空对象将被从预期JSON.parse(JSON.stringify(object));

修改deepClone以成功克隆audioBuffer但保留现有功能的最佳方法是什么?

任何帮助将不胜感激,谢谢!

回答

1

我觉得下面的代码对于克隆对象很有用。

function clone(obj) { 
    if (null == obj || "object" != typeof obj) return obj; 
    var copy = obj.constructor(); 
    for (var attr in obj) { 
     if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr]; 
    } 
    return copy; 
} 

请注意,带有说明的答案在下面的链接中给出。 How do I correctly clone a JavaScript object?

+0

这恐怕是引发错误'类型错误:当调用它'Arrangement.findByIdAndUpdate(doc._id,undefined'不能设置属性 '$ __'{$设置:deepClone(DOC)},功能(err,result){});'(_mongoose驱动程序用于MongoDB_)。关于你的其他建议,你可能会想到其他的错误,你可能想到的那个函数的其他修改? –

+0

你是否愿意查找数据并更新克隆数据MongoDB? –

+0

如果我完全诚实,我不确定你的意思是这个问题,对不起。你的意思是我应该从那个更新语句中拿出'deepClone'函数吗? –