Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.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 复制对象,然后更新JSON对象中的值_Javascript_Jquery_Json - Fatal编程技术网

Javascript 复制对象,然后更新JSON对象中的值

Javascript 复制对象,然后更新JSON对象中的值,javascript,jquery,json,Javascript,Jquery,Json,我在jquery中有一个json对象数组。我想复制一个对象,然后根据if条件替换原始对象中的键值。但每次我替换单个对象中的值时,它就会替换两个对象中的值。我只想更换一件,即原件 我使用了中断和返回错误声明,但不工作 var index=getIndex(class_id,teacher_id); finalJson[index]['teacher_name']='asad'; function getIndex(class_id,teacher_id){ for(var it

我在jquery中有一个json对象数组。我想复制一个对象,然后根据if条件替换原始对象中的键值。但每次我替换单个对象中的值时,它就会替换两个对象中的值。我只想更换一件,即原件 我使用了中断和返回错误声明,但不工作

var index=getIndex(class_id,teacher_id);

    finalJson[index]['teacher_name']='asad';

function getIndex(class_id,teacher_id){
    for(var it in finalJson){
    if(finalJson[it]['class'] == class_id && finalJson[it]['type'] == 'c'){
        finalJson.push(finalJson[it])
        return it;
        }
    }
}
如果情况不好,请大家帮忙。
提前谢谢

将对象复制到新变量时,您正在创建引用。您需要创建一个新对象来防止这种情况,否则应用于一个对象的更改将应用于另一个对象。

当您执行
finalJson.push(finalJson[it])
时,您将再次在数组中推送对旧对象的引用。因此,对一个引用执行的任何操作都将对新引用所指向的对象执行。这就是为什么您需要使用旧对象的属性创建新对象(使用
object.create
)然后推送它

替换

finalJson.push(finalJson[it])
使用(不使用此选项)

push(Object.create(finalJson[it]))

或者一个较慢但深度复制的选项

finalJson.push(JSON.parse(JSON.stringify(finalJson[it])));

相关问题:使用jQuery,您可以使用
$.extend({},finalJson[it])克隆对象
你能发布
finalJson
吗?在问题中也是。用深度复制解决。
Object.create(finalJson[it])
不会克隆对象,只会使用旧对象的原型创建新对象,所以每次旧对象更改时,新对象也会更改。@jcubic我知道它不会进行深度克隆,但在这种情况下,不需要进行深度克隆,因为OP的json似乎不是多级的。无论如何,我已经给出了另一个选项。
Object.create(finalJson[it])
完全是错误的,因为它将像克隆引用一样工作,或者将对象分配给不同的变量
a=finalJson[it]
如果您更改
a
,它也将更改
finalJson[it]
。原型也是如此。这根本不是克隆。@jcubic根据规范创建的新对象具有相同的属性。创建了新对象,但原型取自旧对象,因此如果更改旧对象,新对象将被修改。看看这个