【问题标题】:Web Audio API - Cloning an audioBufferWeb Audio API - 克隆一个 audioBuffer
【发布时间】:2017-09-25 03:22:48
【问题描述】:

我有一个deepClone 函数,我在整个程序中都使用它来克隆一个对象的所有属性和值并返回克隆的对象(参见下面的代码)。我现在想在对象中包含一个audioBuffer 并将其成功复制到返回的对象中。有没有办法修改功能以包含此功能?

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

编辑:有人能想出一种方法将JSON.parse(JSON.stringify(object)) 与作为答案之一提供的解决方案结合起来吗? IE。在克隆发生时检查对象的属性,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);

从代码 sn-p 中可以看出,clonedTracktrackBuffer 被转换为一个空对象,这是JSON.parse(JSON.stringify(object)); 所期望的。

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

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

【问题讨论】:

    标签: javascript clone web-audio-api 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?

    【讨论】:

    • 恐怕这会在调用Arrangement.findByIdAndUpdate(doc._id, { $set: deepClone(doc) }, function(err, result) {}); 时抛出错误TypeError: Cannot set property '$__' of undefined使用mongoose 驱动程序用于MongoDB)。关于您链接到引发其他错误的答案的其他建议,您可能想到的对该函数的任何其他修改?
    • 您是否愿意在MongoDB中查找数据并更新克隆数据?
    • 如果我完全诚实,我不确定你的这个问题是什么意思,抱歉。你的意思是我应该从更新语句中取出deepClone 函数?
    • 我在说Arrangement.findByIdAndUpdate(doc._id, { $set: deepClone(doc) }, function(err, result) {});你愿意使用deepClone函数从mongodb克隆对象并再次将修改后的对象保存到mongodb吗?
    • 是的,我现在正在尝试任何事情:)
    猜你喜欢
    • 1970-01-01
    • 2013-09-25
    • 2018-04-02
    • 2011-11-10
    • 2014-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多