Javascript 动态注册模块的集合排序
在我的应用程序中,我有一个主要模型,我们称它们为Javascript 动态注册模块的集合排序,javascript,vue.js,vuejs2,vuex,Javascript,Vue.js,Vuejs2,Vuex,在我的应用程序中,我有一个主要模型,我们称它们为users。我有一个模块users,其中有一个子模块叫做list 在使用api端点时,我将10个用户作为一个用户数组返回。对于每个用户,我使用id作为键,在用户中的列表模块中为每个用户动态注册一个用户模块 this.registerModule(['users', 'list', user.id], UserModule); 然后,我调度一些操作来补充存储中的数据。这一切都很好 我有一个getter,它将列表模块(包含id作为指向用户的键的对象)
users
。我有一个模块users
,其中有一个子模块叫做list
在使用api端点时,我将10个用户作为一个用户数组返回。对于每个用户,我使用id
作为键,在用户
中的列表
模块中为每个用户动态注册一个用户
模块
this.registerModule(['users', 'list', user.id], UserModule);
然后,我调度一些操作来补充存储中的数据。这一切都很好
我有一个getter,它将列表
模块(包含id
作为指向用户
的键的对象)解析为一个用户数组。它看起来像这样:
users: (state) => {
const users = Object.keys(state.list).map(key => state.list[key]);
return users;
}
state: {
list: {
1: { id: '1', name: 'Tom'},
3: { id: '3', name: 'Bob'}
}
}
问题
当vuex
动态注册单个UserModule
时,它会按字母顺序在列表
模块中对其排序,而不是模块注册的顺序。这是一个问题,因为我希望用户数组的顺序与从api输入的顺序相同
例子
如果端点返回2个用户,如下所示:
[
{ id: '3', name: 'Bob'},
{ id: '1', name: 'Tom'}
]
然后列表模块将如下所示:
users: (state) => {
const users = Object.keys(state.list).map(key => state.list[key]);
return users;
}
state: {
list: {
1: { id: '1', name: 'Tom'},
3: { id: '3', name: 'Bob'}
}
}
然后,用户
getter将返回:
[
{ id: '1', name: 'Tom'},
{ id: '3', name: 'Bob'},
]
我的暂定解决方案是,在每个模块被消耗时,向其中注入一个order属性,然后在getter排序中按该order属性进行排序。感觉不太好,因为我觉得我在无缘无故地添加一个循环来排序
问题
否,JavaScript不保证对象中的属性顺序;你需要使用一个数组。
对,我知道它们不能保证,但它们一直非常一致,问题在于它们被注入列表模块的方式。数字属性总是重新排序,字母属性不会重新排序。这真的很有帮助。谢谢,实际上我们做了一个更好的解决方法,只是将ID的有序数组存储在state中,然后将它们映射到动态注册的模块