2016-03-14 50 views
3

我在jquery中有一个json对象数组。我想复制一个对象,然后根据条件替换原始对象中的键值。但每次我将单个对象中的值替换后,它将替换两个对象中的值。我只想替换原来的一个,即 我已经使用了break和return false statements但是没有工作。复制对象,然后更新JSON对象中的值

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; 
     } 
    } 
} 

请有人帮助这里是条件。 在此先感谢。

+1

相关问题:[什么是最有效的方法来克隆一个n对象?](http://stackoverflow.com/questions/122102/what-is-the-most-efficient-way-to-clone-an-object) – Roberto

+1

使用jQuery,你可以使用'$ .extend( {},finalJson [it]);' – jcubic

+0

你可以发布'finalJson'吗?在这个问题上。用深拷贝解决了 – Jai

回答

4

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

取代

finalJson.push(finalJson[it]) 

与(不使用此选项)

finalJson.push(的Object.create(finalJson [它]))

或较慢但深 - 复制选项

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

巨大的感谢其工作现深拷贝工作:) – Asad

+0

'的Object.create(finalJson [它])'不会克隆对象只能创建旧对象的原型新的对象,所以每次旧对象改变新对象也会改变。 – jcubic

+0

@jcubic我知道它不会做深度克隆,但在这种情况下,不需要深入克隆,因为OP的json似乎不是多层次的。无论如何,我已经给出了另一种选择 – gurvinder372

1

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

+1

谢谢你帮 – Asad