不可变JS - 合并从数组创建一个地图对象列表

时间:2016-09-02 14:19:51

标签: redux react-redux immutable.js

我正在使用redux和immutablejs,我正在尝试创建一个reducer函数。

我遇到了一些我没想到的行为

function GaleriOlustur() {
        var adi = prompt("Galeri İsmi Giriniz");
        if (adi !=="") {
            $("input[name='Adi']").val(adi);
            return true;
        } else {
            alert("Bir İsim Girmelisiniz.");
            return false;
        }
};

以下是const a = new Immutable.Map({ numbers: [{id: 1},{id: 2}] }); const b = a.merge( { numbers: [{id: 4},{id: 5}] } ); a

的值
b

我没想到a.get("numbers"); [Object, Object] b.get("numbers"); List {size: 2, _origin: 0, _capacity: 2, _level: 5, _root: null…} b.get("numbers").get(0); Map {size: 1, _root: ArrayMapNode, __ownerID: undefined, __hash: undefined, __altered: false} 是一个不可变的Map对象列表。

在我的应用程序中,使用redux,我将初始状态设置为:

numbers

我是减速机,当我拿取电影时,我尝试将它们合并如下:

const initialState = new Immutable.Map({
  error: null,
  isBusy: false,
  films: []
});

这导致react组件出现问题,因为return state.merge({ isBusy: false, films: action.payload, error: null }); 最初是一个对象数组,然后它们成为一个不可变的映射列表。

我应该创建不同的初始状态,还是应该使用其他类型的合并?或其他什么?

谢谢

1 个答案:

答案 0 :(得分:2)

我认为你要做的不是整个地图对象的合并,至少不应该是你说的情况,它应该是更新 +( concat 合并):

const a = new Immutable.Map({
  numbers: [{id: 1},{id: 2}]
});

const b = a.update("numbers", numbers =>
  numbers.concat([{id: 4},{id: 5}])
  // or
  numbers.merge([{id: 4},{id: 5}])
);

通过在代码中进行合并,由于" merge"的性质,您将覆盖现有的代码。因为合并中的键是相同的; "数字"