是否有可能对现有物体进行构造?(Javascript ES6)

maj*_*mer 105 javascript destructuring ecmascript-6

例如,如果我有两个对象:

var foo = {
  x: "bar",
  y: "baz"
}
Run Code Online (Sandbox Code Playgroud)

var oof = {}
Run Code Online (Sandbox Code Playgroud)

我想将x和y值从foo转移到oof.有没有办法使用es6解构语法?

也许是这样的:

oof{x,y} = foo
Run Code Online (Sandbox Code Playgroud)

log*_*yth 83

虽然丑陋而且有点重复,但你可以做到

({x: oof.x, y: oof.y} = foo);
Run Code Online (Sandbox Code Playgroud)

它将读取foo对象的两个值,并将它们写入对象上的各自位置oof.

就我个人而言,我还是会读

oof.x = foo.x;
oof.y = foo.y;
Run Code Online (Sandbox Code Playgroud)

要么

['x', 'y'].forEach(prop => oof[prop] = foo[prop]);
Run Code Online (Sandbox Code Playgroud)

虽然.

  • 替代 ['x', 'y'].forEach(prop => oof[prop] = foo[prop]); 如我所见,是唯一一个 DRY(不要重复自己),直到现在。在要映射多个键的情况下,“DRY”确实很有用。您只需要更新一处。也许我错了。不管怎么说,还是要谢谢你! (3认同)
  • 第三个示例是 DRY,但您必须使用字符串作为键,javascript 通常会隐式执行此操作。不相信这比: const {x, y} = foo; 更麻烦。常量 oof = {x, y}; (2认同)

Ber*_*rgi 33

不,解构不支持shorthands中的成员表达式,但是当前时只支持普通的属性名.目前已经谈关于这样的esdiscuss,但不建议将它做成ES6.

Object.assign然而,您可以使用- 如果您不需要所有属性,您仍然可以使用

var foo = …,
    oof = {};
{
    let {x, y} = foo;
    Object.assign(oof, {x, y})
}
Run Code Online (Sandbox Code Playgroud)

  • @loganfsmyth,至少在我的节点4.2.2测试中,你的例子对我不起作用.启用`--harmony_destructuring`.我看到"SyntaxError:Unexpected token". (3认同)

Zfa*_*len 21

IMO这是完成您所需要的最简单的方法:

let { prop1, prop2, prop3 } = someObject;
let data = { prop1, prop2, prop3 };

  // data === { prop1: someObject.prop1, ... }
Run Code Online (Sandbox Code Playgroud)

基本上,解构为变量然后使用初始化程序简写来创建一个新对象.没必要Object.assign

无论如何,我认为这是最可读的方式.您可以在此选择someObject您想要的精确道具.如果您有一个现有的对象,您只想将道具合并到,请执行以下操作:

let { prop1, prop2, prop3 } = someObject;
let data = Object.assign(otherObject, { prop1, prop2, prop3 });
    // Makes a new copy, or...
Object.assign(otherObject, { prop1, prop2, prop3 });
    // Merges into otherObject
Run Code Online (Sandbox Code Playgroud)

另一种可以说更清晰的写作方式是:

let { prop1, prop2, prop3 } = someObject;
let newObject = { prop1, prop2, prop3 };

// Merges your selected props into otherObject
Object.assign(otherObject, newObject);
Run Code Online (Sandbox Code Playgroud)

我将此用于POST请求很多,我只需要一些离散数据.但是,我同意应该有一个班轮来做这件事.

  • 这就是我所做的,但它不是很干。我认为很多人真正需要的只是提取键功能。 (2认同)

Gaa*_*far 11

除了Object.assign存在物体传播语法这是ECMAScript的一个阶段2提议.

var foo = {
  x: "bar",
  y: "baz"
}

var oof = { z: "z" }

oof =  {...oof, ...foo }

console.log(oof)

/* result 
{
  "x": "bar",
  "y": "baz",
  "z": "z"
}
*/
Run Code Online (Sandbox Code Playgroud)

但要使用此功能,您需要使用stage-2transform-object-rest-spread插件为babel.这是关于babel演示stage-2

  • 这实际上并不在现有对象上设置属性,而是创建一个包含两者的所有属性的新对象. (9认同)

Mat*_*ter 6

BabelJS插件

如果您使用的是BabelJS,现在可以激活我的插件babel-plugin-transform-object-from-destructuring(请参阅npm软件包以了解安装和使用情况).

我有同样的问题在这个线程中描述,对我来说,当你从解构表达式创建一个对象时,这是非常令人疲惫的,特别是当你必须重命名,添加或删除属性时.有了这个插件,维护这样的场景对你来说变得更加容易.

对象示例

let myObject = {
  test1: "stringTest1",
  test2: "stringTest2",
  test3: "stringTest3"
};
let { test1, test3 } = myObject,
  myTest = { test1, test3 };
Run Code Online (Sandbox Code Playgroud)

可以写成:

let myTest = { test1, test3 } = myObject;
Run Code Online (Sandbox Code Playgroud)

数组示例

let myArray = ["stringTest1", "stringTest2", "stringTest3"];
let [ test1, , test3 ] = myArray,
  myTest = [ test1, test3 ];
Run Code Online (Sandbox Code Playgroud)

可以写成:

let myTest = [ test1, , test3 ] = myArray;
Run Code Online (Sandbox Code Playgroud)

  • `let myTest = { test1, test3 } = myObject;` 不起作用 (3认同)