如何在immutable.js中合并地图?

时间:2017-07-18 02:33:25

标签: javascript reactjs immutable.js

我想得到如下地图:

Map{
   "status":1,
    "user":{
        "name":"more",
        "age":8,
        "id":1
    }
}

我的完整代码是:

import {fromJS} from 'immutable'
let b={
    "user":{
         name:"more11",
         age:8
    },
    "status":1
}
let d={
    "id":1,
    "name":"more",
    "age":19
}
let d1=fromJS(d)
let b2=fromJS(b)
Const map2=b1.get('user).mergeDeepIn(d1)
console.log(map2.getIn(['user','name']));
console.log(map2.getIn(['user','age']));

原始代码image

2 个答案:

答案 0 :(得分:3)

const { Map } = require('immutable')

let map1 = Map({a:1,b:{c:2,d:3,e:1}});

let map2 = Map({c:100,d:400});
let map3 = Map(map1.get('b'));
let map4 = map3.merge(map2);
let map5 = map1.set('b',map4);
console.log(map5);

答案 1 :(得分:0)

由于你的map1是嵌套的,并且map1只匹配它的嵌套部分,所以没有办法自动合并它们而不实际指向那里的内容。

这是一个使用对象扩展运算符合并底层地图对象的示例:

import { Map } from 'immutable'

const map1 = new Map({
  a: 1, 
  b: {
    c: 2, 
    d: 3, 
    e:1
  },
})

const map2 = new Map({
  c: 100,
  d: 400
})

const map3 = new Map({ 
  ...map1.toObject(), 
  b: { 
    ...map1.get('b'),
    ...map2.toObject(),
  } 
})

console.log(
  map3.toObject() // Map { a: 1, b: { c: 100, d: 400, e: 1} }
)

使用Ramda

可以更简洁的方式实现同​​样的目标
import R from 'ramda'

const map4 = new Map(
  R.evolve({ b: R.merge(R.__, map2.toObject()) }, map1.toObject())
)

演示:http://jsbin.com/refayef/2/edit?js,console