Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/473.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在javascript中创建完全独立的关联数组克隆或拷贝,即不引用原始数据值?_Javascript_Arrays_D3.js_Copy_Clone - Fatal编程技术网

如何在javascript中创建完全独立的关联数组克隆或拷贝,即不引用原始数据值?

如何在javascript中创建完全独立的关联数组克隆或拷贝,即不引用原始数据值?,javascript,arrays,d3.js,copy,clone,Javascript,Arrays,D3.js,Copy,Clone,我一直在尝试克隆以下内容,以避免所有对原始数据的引用: 最初,使用该方法的d3.js选择,虽然正确地复制了DOM元素,但在函数调用中保留了对选择数据d参数的引用 它的核心数组,使用d3的selection.data函数提取。克隆似乎失败的部分原因是,目标结构似乎是对象和数组的混合体,而且,因为所谓的克隆通常保留对原始数据的引用,这意味着对其中一个数据的更改会反映在另一个数据中。另一个小问题是复制了通常为空的元素 注意:JSON.parseJSON.stringifyobject在这两种情况下都没

我一直在尝试克隆以下内容,以避免所有对原始数据的引用:

最初,使用该方法的d3.js选择,虽然正确地复制了DOM元素,但在函数调用中保留了对选择数据d参数的引用

它的核心数组,使用d3的selection.data函数提取。克隆似乎失败的部分原因是,目标结构似乎是对象和数组的混合体,而且,因为所谓的克隆通常保留对原始数据的引用,这意味着对其中一个数据的更改会反映在另一个数据中。另一个小问题是复制了通常为空的元素

注意:JSON.parseJSON.stringifyobject在这两种情况下都没有用处,因为它适用于对象,而d3使用/强制/输出数组

应用于数组时,除了它也复制引用之外,下面所示类型的对象克隆/复制函数在所有方面都可以正常工作。尽管保留了引用,但它已被提供并接受为许多javascript标记对象克隆问题的解决方案

function transfer(obj) {
    var result = [];
    for (var property in obj) {
        if (obj.hasOwnProperty(property)) {
            result[property.toString()] = arr[property];
        }
    }
    return result;
};
一、 但是,确实需要完全独立于当前/原始版本。看来不管我做什么,参考文献都会被复制

我怎么知道?每隔一段时间,当前选择/数组是一个克隆的b,然后是前一个指定的b,没有进一步的直接更改。除此之外,对克隆所做的任何更改都会立即反映在原始版本中,并通过将其重新定位到以前的版本中保持不变。。克隆的全部目的就是为了避免这种情况

有没有更好的方法,或者可以修改上面的代码,使其提供一个新的、完全独立的数组,但具有相同的数据值?甚至可以直接以d3为中心对原始选择进行此操作吗

顺便说一句,要克隆的阵列非常简单,它是按照以下思路创建的:

var arr = [];
arr["key1"] = "value1";
arr["key2"] = 2;
 :     :      :
。。。然后是惯用的d3追加调用链

顺便说一句,在我相当大的代码库之外进行模拟的每一次尝试都会陷入数据格式问题的泥潭。这真是个令人惊讶的雷区

很高兴有任何建议。 谢谢
Thug

要使用selection.data深度复制从d3.js选择中检索到的数组,请执行以下操作:

这个链接更容易在其他答案中找到,这使得这个问题有点重复


当d3.js的限制被推后,问题会更频繁地出现,因此,与其删除它,不如将其保留在这里……

您询问的是一个数组,但在示例数组中,您将其视为一个对象。试着发布一个示例并写下预期的行为是的,看起来你完全混淆了数组和对象。请仔细阅读,不建议像这样设置自定义数组索引。要生成数组的精确副本,可以在for循环中将所有属性推送到新属性。或者在其他库中使用函数或类似的东西。@Tyblitz他可能需要递归,以防他有嵌套数组和对象如果我把事情弄混了,那是因为花了太多时间才找到一个代码,它首先会复制关联数组键/值对,但会留下未定义的元素。如果有更好的选择,我洗耳恭听@在这一点上,没有递归问题。@user1019696就像我之前写的,如果您发布一个示例,它会有所帮助。写下预期的行为,包括排除未定义的行为,并举例说明该行为如何不适用于您的版本。
var arr = [];
arr["key1"] = "value1";
arr["key2"] = 2;
 :     :      :