immutable.js - 我可以在 immutable.js 中使用解构赋值吗?

标签 immutable.js destructuring

对于标准的 JS 对象,可以使用解构赋值,例如:

let obj = {name: 'james', code: '007'}
let {name, code} = obj // creates new variables 'name' and 'code' (with the proper values)

正如一些 Flux/Redux 布道者所建议的,我为我的应用程序使用 immutable.js;我可以在不可变列表/ map 上也使用解构吗?当然,可以这样做:
let obj = immutable.fromJS({name: 'james', code: '007'})
let {name, code} = obj.toJS()

但是随着对象变大,这似乎效率很低(因为对象需要首先深入 jsified)。

最佳答案

使用不可变列表,解构工作非常简单。这是因为数组的解构适用于每个可迭代对象( Checking whether something is iterable ),而不仅仅适用于 js 数组。

有了 Map,情况就更复杂了。与 List 不同的是,类 Map 结构的解构仅适用于普通的 JS 对象,仅此而已。目前,ES 社区似乎并不认为这是一个好主意(见 https://esdiscuss.org/topic/extensible-destructuring-proposal)

但是,存在启用此功能的 babel 插件:https://github.com/vacuumlabs/babel-plugin-extensible-destructuring
在 .babelrc 中安装并启用此插件后,您可以简单地修补不可变 Map 以获得 .@@get方法定义:

// main.js, first file loaded
import {Iterable} from 'immutable';
Iterable.prototype[Symbol.for('get')] = function(value) {return this.get(value); };

一切正常(也是嵌套解构,或使用默认值解构)
import {fromJS} from 'immutable';
const map = fromJS({author: {name: {first: "John", last: "Doe"}, birthdate: "10-10-2010"}});
const {author: {name: {first, last}, birthdate}} = map;

免责声明:我是上述插件的作者之一。

关于immutable.js - 我可以在 immutable.js 中使用解构赋值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34762608/

相关文章:

reactjs - React/Redux 中树结构和 shouldComponentUpdate 的性能问题

javascript - 在 Immutable.js 中扩展记录

javascript - 使用 D3.js 和 Immutable.js

Scala 极端解构?

Python赋值解构

javascript - Immutable.js 中的 "ownerID"是什么?

reactjs - react 还原: Cannot set on an immutable record

javascript - 是否可以将对象解构为现有变量?

javascript - 如何使用条件进行对象解构?

Javascript 解构数组