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中,然后将它们映射到动态注册的模块