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

使用析构函数赋值进行部分对象复制

  •  1
  • nico  · 技术社区  · 6 年前

    有一个需要复制到另一个对象的输入对象是很常见的。通常,您需要复制一些属性,最终得到一个非常相似的对象,但属性较少。

    此处引用销毁赋值 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#Object_destructuring

    假设您有这个输入对象:

    // an object with data
    let oldObject = {
      a: 'this is a',
      b: 'this is b',
      c: 'this is c',
      d: 'this is d'
    }
    

    我就是这样做的:

    let myNewObject = {
      a: oldObject.a,
      b: oldObject.b,
      c: oldObject.c
    }
    

    这是我一直使用的:

    // new version
    let { a, b, c } = oldObject
    let myNewObject = { a, b, c };
    

    这个我开始用了,好像可以用:

    // newer version
    let myNewObject = { a, b, c } = oldObject;
    

    新版本的问题是我要声明变量A、B和C。在这种情况下没有问题。( almost 但是如果他们的名字是 input , output , temp , i 或可能已在作用域中声明的变量的任何其他通用名称。

    所以这个解决方案是很好的,但更好的是,这些变量是以某种方式在该行中创建和销毁的,而不是在其他地方可用的。 myNewObject 当然应该是可以接近的。

    我试着用这样的函数包装它,但一点运气也没有:

    let myNewObject = (function() { return { a, b, c } = oldObject })();
    
    let myNewObject = (function() { let temp = { a, b, c } = oldObject; return temp; })();
    

    所以我不确定什么是最好的方法来实现这一点,我正在接近,但我错过了一些东西。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Estus Flask    6 年前

    let myNewObject = { a, b, c } = oldObject;
    

    a b c myNewObject === oldObject ES5 variation

    var myNewObject = (a = oldObject.a, b = oldObject.b, c = oldObject.c, oldObject);
    

    this answer

    let myNewObject = (({ a, b, c }) => ({ a, b, c }))(oldObject);