Javascript 如何制作排序函数来解决这个问题?

Javascript 如何制作排序函数来解决这个问题?,javascript,arrays,node.js,object,Javascript,Arrays,Node.js,Object,我有一个对象数组。每个对象都包含名称和用户id属性 const queue = [ { user: 1, song: "Song1", }, { user: 1, song: "Song2", }, { user: 2, song: "Song3", }, { user: 1, song: "Song4", }, { user: 3, song: "Song5", }, ];

我有一个对象数组。每个对象都包含名称和用户id属性

const queue = [
  {
    user: 1,
    song: "Song1",
  },
  {
    user: 1,
    song: "Song2",
  },
  {
    user: 2,
    song: "Song3",
  },
  {
    user: 1,
    song: "Song4",
  },
  {
    user: 3,
    song: "Song5",
  },
];
我想对它进行排序,使它看起来像这样

const queue = [
  {
    user: 1,
    song: "Song1",
  },
  {
    user: 2,
    song: "Song3",
  },
  {
    user: 3,
    song: "Song5",
  },
  {
    user: 1,
    song: "Song2",
  },

  {
    user: 1,
    song: "Song4",
  },

];
所以。如果用户1向队列中添加10首歌曲,用户2向队列中添加1首歌曲,用户3向队列中添加3首歌曲,则队列将类似于
user_1_条目、user_2_条目、user_3_条目、user_1_条目、user_3_条目、user_3_条目、user_1_条目[…]

如何解决这个问题?

您可以使用临时对象和哈希表来处理相同的组数组。将所用数组的长度作为组进行排序

排序与组和索引一起进行

结果与已排序临时数组的索引映射

const
队列=[{用户:1,歌曲:“歌曲1”},{用户:1,歌曲:“歌曲2”},{用户:2,歌曲:“歌曲3”},{用户:1,歌曲:“歌曲4”},{用户:3,歌曲:“歌曲5”},
groups=Object.create(空),
结果=队列
.map(({user},index)=>({index,group:groups[user]=(groups[user]| | 0)+1}))
.sort((a,b)=>a.group-b.group | | a.index-b.index)
.map(({index})=>queue[index]);
控制台日志(结果)
.as控制台包装{max height:100%!important;top:0;}
您可以通过为同一组数组使用带有哈希表的临时对象来使用。将所用数组的长度作为组进行排序

排序与组和索引一起进行

结果与已排序临时数组的索引映射

const
队列=[{用户:1,歌曲:“歌曲1”},{用户:1,歌曲:“歌曲2”},{用户:2,歌曲:“歌曲3”},{用户:1,歌曲:“歌曲4”},{用户:3,歌曲:“歌曲5”},
groups=Object.create(空),
结果=队列
.map(({user},index)=>({index,group:groups[user]=(groups[user]| | 0)+1}))
.sort((a,b)=>a.group-b.group | | a.index-b.index)
.map(({index})=>queue[index]);
控制台日志(结果)

.as控制台包装{最大高度:100%!重要;顶部:0;}
快速且迭代次数少
。基于用户对元素进行分组,并从所有用户中逐个收集歌曲

const队列=[
{用户:1,歌曲:“Song1”},
{用户:1,歌曲:“Song2”},
{用户:2,歌曲:“Song3”},
{用户:1,歌曲:“Song4”},
{用户:3,歌曲:“Song5”},
];
常量映射器=(数据)=>{
返回数据。减少((m,i)=>{
如果(!m[i.user])m[i.user]=[];
m[i.user].push(i);
返回m;
}, []);
};
const collect=(队列)=>{
const mappedData=mapper(队列);
让结果=[],
计数器=0,
行=0;
while(计数器<队列长度){
if(mappedData[row]&&mappedData[row].length){
const d=mappedData[row].shift();
结果:推(d);
计数器++;
}
行++;
如果(row==mappedData.length)row=0;
}
返回结果;
};
console.log(collect(queue));

//分组排序(队列)
快速且迭代次数少
。基于用户对元素进行分组,并从所有用户中逐个收集歌曲

const队列=[
{用户:1,歌曲:“Song1”},
{用户:1,歌曲:“Song2”},
{用户:2,歌曲:“Song3”},
{用户:1,歌曲:“Song4”},
{用户:3,歌曲:“Song5”},
];
常量映射器=(数据)=>{
返回数据。减少((m,i)=>{
如果(!m[i.user])m[i.user]=[];
m[i.user].push(i);
返回m;
}, []);
};
const collect=(队列)=>{
const mappedData=mapper(队列);
让结果=[],
计数器=0,
行=0;
while(计数器<队列长度){
if(mappedData[row]&&mappedData[row].length){
const d=mappedData[row].shift();
结果:推(d);
计数器++;
}
行++;
如果(row==mappedData.length)row=0;
}
返回结果;
};
console.log(collect(queue));

//分组排序(队列)排序的逻辑是什么?重复1-3次直到筋疲力尽?@VLAZ我正在尝试建立“友好队列”系统。所以,如果新用户在队列中添加了一些内容,他不必等到所有以前的歌曲都播放完毕。我个人只需为每个用户保留一个队列,然后在选择下一首歌曲时对它们进行循环。似乎更容易调试和维护,而不是一直重新洗牌相同的列表。排序的逻辑是什么?重复1-3次直到筋疲力尽?@VLAZ我正在尝试建立“友好队列”系统。所以,如果新用户在队列中添加了一些内容,他不必等到所有以前的歌曲都播放完毕。我个人只需为每个用户保留一个队列,然后在选择下一首歌曲时对它们进行循环。似乎更容易调试和维护,而不是一直重新洗牌相同的列表。