Javascript 如何对不可变映射中的项进行排序(交换)?

Javascript 如何对不可变映射中的项进行排序(交换)?,javascript,arrays,sorting,redux,immutable.js,Javascript,Arrays,Sorting,Redux,Immutable.js,我想交换映射中不可变列表中的项目, 例如: const Map = Immutable.fromJS({ name:'lolo', ids:[3,4,5] }); 我尝试使用splice进行交换,也尝试使用不可变的方法insert() 假设我想从[3,4,5]交换到[3,5,4],我正在做这样的事情: list.set('ids',list.get('ids')。拼接(2,0,list.get('ids')。拼接(1,1)[0]) 使用Immutable.js对不可变数据结构中

我想交换
映射中不可变列表中的项目,
例如:

const Map = Immutable.fromJS({
    name:'lolo',
    ids:[3,4,5]
});
我尝试使用splice进行交换,也尝试使用不可变的方法
insert()

假设我想从
[3,4,5]
交换到
[3,5,4]
,我正在做这样的事情:

list.set('ids',list.get('ids')。拼接(2,0,list.get('ids')。拼接(1,1)[0])


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

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

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

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

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

您应该使用,为此:

map.update('ids', idsList => idsList.withMutations(function (idsList) {
    let temp = idsList.get(2);
    return idsList.set(2, idsList.get(1)).set(1, temp);
}));
请注意,我将您的
列表
重命名为
映射
——这实际上是一个
映射


对于简单的排序,请选择

map.update('ids', idsList => idsList.sort(function (a, b) {
    // magic
});
为此,您应使用和:

map.update('ids', idsList => idsList.withMutations(function (idsList) {
    let temp = idsList.get(2);
    return idsList.set(2, idsList.get(1)).set(1, temp);
}));
请注意,我将您的
列表
重命名为
映射
——这实际上是一个
映射


对于简单的排序,请选择

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);
    }));
}
参数化:

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);
    }));
}

想象一下,我在redux中使用它,难道我不能从一个reducer返回一个新版本的数据结构吗?一开始,我想用
withMutations()来搞乱
,但实际上你自己的函数是最好的选择。顺便说一句,如果你仔细想想,即使是在普通易变数据上,交换也是一系列非常棘手的操作。想象一下,我在redux中使用这个函数,我能不能从一个减缩器中返回一个新版本的数据结构?起初,我想用突变来处理
()
,但实际上你自己的函数是最好的选择。顺便说一句,如果你仔细想想,即使是在普通的可变数据上,交换也是一系列令人尴尬的操作。基于你的代码,这些代码片段也在做同样的事吗?没有。你将
.update()
更改为
.set()
并且它们是不可互换的,因为
set
将只接受第二个参数并将其放在指定的位置,而
update
将从第二个参数调用updater函数并设置返回值。看到区别了吗?根据您的代码,这些代码片段是否也这样做了?没有。您更改了
.update()
.set()
它们是不可互换的,因为
set
将只接受第二个参数并将其放在指定的位置,而
update
将从第二个参数调用updater函数并设置返回值。看到区别了吗?