Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/83.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 jQuery数据方法将数据推送到子对象_Javascript_Jquery - Fatal编程技术网

Javascript jQuery数据方法将数据推送到子对象

Javascript jQuery数据方法将数据推送到子对象,javascript,jquery,Javascript,Jquery,在jQuery的.data()函数中看到了非常奇怪的行为。当我给父元素赋值时,它的子元素也会被赋值 html: 我是个孩子 我是另一个孩子 js: somearray=[“child1”、“child2”] $(“.things”).data(“最高的”,[]) for(var i=0;i

在jQuery的.data()函数中看到了非常奇怪的行为。当我给父元素赋值时,它的子元素也会被赋值

html:

我是个孩子
我是另一个孩子
js:
somearray=[“child1”、“child2”]
$(“.things”).data(“最高的”,[])
for(var i=0;i
查看此小提琴(控制台日志中记录了问题):

应该发生什么:
  • 任何对象的数据变量中存储的所有值都将被清除
  • 循环遍历数组并将“20”推送到父对象
    $(“#父”)
    的数据数组上
  • $(“#父”)。数据(“最高的”)
    应该等于[20,20]-它确实是
  • 但是,
    $(“#child1”).data(“最高的”)
    ==[20,20]
  • 在任何时候都没有子对象被分配到.data(“最高的”),所以我不知道为什么会发生这种情况

  • 我在这里缺少什么?

    您可以初始化所有。
    项,使其对同一空数组具有完全相同的引用。因此,当您修改一个数组时,它们都会更改,因为它们都指向同一个数组。请记住,数组是通过引用分配和检索的。因此,这一行:

    $(".things").data("tallest",[])
    
    正在为每个
    .things
    对象分配对完全相同数组的引用。改变一个,它们都会改变,这就解释了你的输出


    您可以将其修复并简化如下:

    // initialize all things to have their own empty array for data
    $(".things").each(function() {
        $(this).data("tallest", []);
    });
    ["#child1", "#child2"].each(function() {
        // get reference to parent data array and push a value onto it
        $(this).parent().data("tallest").push(20);
        // you don't have to set it back because the array is by reference so already changed
    });
    


    在操作数组时,还必须非常小心,因为数组是通过引用传递的。因此,当您从一个地方获取数据并对其进行修改时,您正在修改原始数据,因为获取数组并没有创建副本,它只是有一个引用。我不认为这会影响你,但如果你试图从一个元素中获取数据,修改它并将其分配给另一个元素,那么很容易做到。

    你可以初始化所有。
    事物
    项,使它们对同一个空数组具有完全相同的引用。因此,当您修改一个数组时,它们都会更改,因为它们都指向同一个数组。请记住,数组是通过引用分配和检索的。因此,这一行:

    $(".things").data("tallest",[])
    
    正在为每个
    .things
    对象分配对完全相同数组的引用。改变一个,它们都会改变,这就解释了你的输出


    您可以将其修复并简化如下:

    // initialize all things to have their own empty array for data
    $(".things").each(function() {
        $(this).data("tallest", []);
    });
    ["#child1", "#child2"].each(function() {
        // get reference to parent data array and push a value onto it
        $(this).parent().data("tallest").push(20);
        // you don't have to set it back because the array is by reference so already changed
    });
    

    在操作数组时,还必须非常小心,因为数组是通过引用传递的。因此,当您从一个地方获取数据并对其进行修改时,您正在修改原始数据,因为获取数组并没有创建副本,它只是有一个引用。我不认为这会影响您,但如果您尝试从一个元素获取数据,修改它并将其分配给另一个元素,则很容易做到这一点。

    问题在于:

    $(".things").data("tallest",[])
    
    您正在将相同的数组放入每个元素的数据中。因此,通过原型继承,它们都共享对同一数组的引用

    改为:

    $(".things").each(function(){
        $(this).data("tallest",[])
    })
    
    每个都有自己独特的阵列

    简单对象引用示例:

    var a=[];
    var b=a;
    b.push('foo');
    alert(a[0]); //foo
    
    问题在于:

    $(".things").data("tallest",[])
    
    您正在将相同的数组放入每个元素的数据中。因此,通过原型继承,它们都共享对同一数组的引用

    改为:

    $(".things").each(function(){
        $(this).data("tallest",[])
    })
    
    每个都有自己独特的阵列

    简单对象引用示例:

    var a=[];
    var b=a;
    b.push('foo');
    alert(a[0]); //foo
    

    为什么要把20推到一个阵列上?既然HTML标记中没有元素
    $('child1')
    $('child2')
    (您省略了
    #
    ),那么
    $(tocheck)
    应该是什么目标。仅供参考,没有理由在HTML标记中包含
    数据=“[]”
    ,因为您正在用JS初始化它。@jfriend00-实际上,最初绘制这些值时,后端可以在其中插入值。文档的初始状态是从Rails后端加载的,然后各种情况会导致此函数重新初始化“最高”值。这只是一个简化版本,但是有足够的片段,如果我做了一些愚蠢的事情,你们可以找到它。为什么你们要把20推到一个数组上?既然HTML标记中没有元素
    $('child1')
    $('child2')
    (您省略了
    #
    ),那么
    $(tocheck)
    应该是什么目标。仅供参考,没有理由在HTML标记中包含
    数据=“[]”
    ,因为您正在用JS初始化它。@jfriend00-实际上,最初绘制这些值时,后端可以在其中插入值。文档的初始状态是从Rails后端加载的,然后各种情况会导致此函数重新初始化“最高”值。这只是一个简化版本,但是有足够的片段,如果我做了一些愚蠢的事情,你们可以找到它。我没有注意到
    tocheck
    问题……反正不需要这一行,因为
    data()中存储的数组已经被更新了reference@charlietfl-我想任务可能不需要,除了第一次数据实际上还没有出现在jQuery的javascript中——只出现在属性中。然后,我想它必须被设置回去,但是在JSFIDLE关闭的情况下,我无法轻松地进行测试。看这里,我删除了最后一行,并使用
    each
    来创建初始数组。angular.js一直在使用这些东西……在这个框架中,这些事情一直在发生。一切都是基于对数据的继承binding@charlietfl-是的,我意识到他们已经将所有数据初始化到
    []
    ,它将始终是一个引用,不需要返回任何作业。我已经更新了我的简化版本。是的……如果OP刚刚离开标记的话