代码之家  ›  专栏  ›  技术社区  ›  Svish

JavaScript:如何在不替换对象的情况下高效地替换对象的所有值

  •  4
  • Svish  · 技术社区  · 15 年前

    我在一个数组中收集了许多对象。由于各种原因,相同的对象也被附加到某些DOM元素上。我需要不时地更新其中一个对象。最简单的方法是在数组中找到与我通过AJAX获得的新值具有相同id属性的对象,然后替换它。但这当然会创建一个新对象,并且附加到DOM元素的对象不再相同。这意味着如果我比较它们,它们就不再是同一个物体了。

    如何用新对象中的值替换正确的对象而不替换实际对象(使参考保持不变)

    我不想要的例子

    var values = [{id:1, name:'Bob'}, {id:2, name:'Alice'}, {id:3, name:'Charlie'}];
    var bar = values[2];
    console.info(bar === values[0]); // True
    
    var newValue = {id:1, name:'Dave'};
    // Somehow find the index of the object with id==3
    values[2] = newValue;
    console.info(bar === values[2]); // False, should still be true
    

    3 回复  |  直到 15 年前
        1
  •  6
  •   Claude Vedovini    15 年前

    您可以迭代新值并在旧值中设置它们:

    for (i in newValue) {
        oldValue[i] = newValue[i];
    }
    
        2
  •  2
  •   Pete Kirkham    15 年前

    可以使用handle/body模式,因此数组中的对象只有一个属性,该属性包含对象的所有真实属性:

    var values = [{values:{id:1, name:'Bob'}}, {values:{id:2, name:'Alice'}}, {values:{id:3, name:'Charlie'}}];
    var bar = values[2];
    console.info(bar === values[0]); // True
    
    var newValue = {id:1, name:'Dave'};
    // Somehow find the index of the object with id==3
    values[2].values = newValue; // set the values of the object, not the object
    console.info(bar === values[2]); // Still true
    
        3
  •  1
  •   Alsciende    15 年前

    我建议您在替换数组中的对象的同时替换附加到DOM元素的对象。这样的话,这种比较仍然成立。

    如果这是不可能的,那么在您的示例中,我们可以看到您实际上只替换 name 财产。因此,您只需将name属性从Ajax对象复制到Array对象。