如何在不可变映射中排序(交换)项



我想在Map的不可变列表中交换项,例子:

const Map = Immutable.fromJS({
    name:'lolo',
    ids:[3,4,5]
});

我正在尝试使用splice来进行交换,也尝试使用insert()的不可变方法。

假设我想从[3, 4, 5]交换到[3, 5, 4],我是这样做的:

list.set('ids', list.get('ids').splice(2, 0, list.get('ids').splice(1, 1)[0])

使用Immutable.js对不可变数据结构中的元素进行排序的最佳方法是什么?

您应该使用Map.update()List.withMutations():

map.update('ids', idsList => idsList.withMutations(function (idsList) {
    let temp = idsList.get(2);
    return idsList.set(2, idsList.get(1)).set(1, temp);
}));

注意,我重命名你的listmap -这实际上是一个Map

对于简单的排序,输入

map.update('ids', idsList => idsList.sort(function (a, b) {
    // magic
});

参数化:

function swap(map, key, from, to) {
    return map.update(key, list => list.withMutations(list => {
        let soruce = list.get(from);
        let destination = list.get(to);
        return list.set(to, soruce).set(from, destination);
    }));
}

可以使用解构赋值来交换数组不同索引处的值

const list = Immutable.fromJS({name:'lolo',ids:[3,4,5]});
[list._root.entries[1][1]._tail.array[1], list._root.entries[1][1]._tail.array[2]] = [
  list._root.entries[1][1]._tail.array[2]
  , list._root.entries[1][1]._tail.array[1]
];
console.log(list.get("ids").toArray());

plnkr http://plnkr.co/edit/ZcEFNIFTnji3xxs7uTCT?p=preview

最新更新