fromJS()

完全地将一个JS对象转或数组转换为不可变的Maps或Lists。

  1. fromJS(
  2. jsValue: any,
  3. reviver?: (
  4. key: string | number,
  5. sequence: Collection.Keyed<string, any> | Collection.Indexed<any>,
  6. path?: Array<string | number>
  7. ) => any
  8. ): any

reviver是可选参数,它将在每个集合(collection)上调用,接受Seq(从最深层到顶层)和当前集合的key,父级JS对象将作为this被提供。在最顶层的对象的key为"" 。reviver将会返回一个新的不可变集合,同时允许自定义转换一个深层次的JS对象。path将会提供从开始到当前值的Key系列。

以下是一个由原始JS数据转换为List和OrderedMap:

  1. const { fromJS, isIndexed } = require('immutable')
  2. fromJS({ a: {b: [10, 20, 30]}, c: 40}, function (key, value, path) {
  3. console.log(key, value, path)
  4. return isIndexed(value) ? value.toList() : value.toOrderedMap()
  5. })
  1. > "b", [ 10, 20, 30 ], [ "a", "b" ]
  2. > "a", { b: [10, 20, 30] }, c: 40 }, [ "a" ]
  3. > "", {a: {b: [10, 20, 30]}, c: 40}, []

如果reviver未提供,那么默认地,Array会转换为List,Object会转换为Map。

事实上,reviver和JSON.parse参数一致。

fromJS是保守的转换,它只会将能被Array.isArray认证的数组转换为List,只会转换原始的对象(不包含自定义原型)为Map。

注意,当一个JS对象转换为不可变Map时,尽管不可变Map可接受任意类型键值,JS对象的索引永远为字符串,即使你使用简写。

  1. let obj = { 1: "one" };
  2. Object.keys(obj); // [ "1" ]
  3. obj["1"]; // "one"
  4. obj[1]; // "one"
  5. let map = Map(obj);
  6. map.get("1"); // "one"
  7. map.get(1); // undefined

当使用任意类型去查询JS对象的索引它将会隐式转换为字符串,但不可变Map使用get()去索引时,它的参数将不会被转换。

  1. "Using the reviver parameter"