我有对象数组。每个对象都包含名称和user_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_entry,user_2_entry,user_3_entry,user_1_entry,user_3_entry,user_1_entry, user_3_entry, user_1_entry [...]
我该如何解决这个问题?
答案 0 :(得分:0)
您可以通过将具有哈希表的临时对象用于同一组数组来使用sorting with map。将使用的数组的长度作为组进行排序。
排序与组和索引有关。
结果与已排序的临时数组的索引映射。
const
queue = [{ user: 1, song: "Song1" }, { user: 1, song: "Song2" }, { user: 2, song: "Song3" }, { user: 1, song: "Song4" }, { user: 3, song: "Song5" }],
groups = Object.create(null),
result = queue
.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]);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 1 :(得分:0)
Fast and less iteration
。根据用户进行分组,并从所有用户中一一收集歌曲
const queue = [
{ user: 1, song: "Song1" },
{ user: 1, song: "Song2" },
{ user: 2, song: "Song3" },
{ user: 1, song: "Song4" },
{ user: 3, song: "Song5" },
];
const mapper = (data) => {
return data.reduce((m, i) => {
if (!m[i.user]) m[i.user] = [];
m[i.user].push(i);
return m;
}, []);
};
const collect = (queue) => {
const mappedData = mapper(queue);
let result = [],
counter = 0,
row = 0;
while (counter < queue.length) {
if (mappedData[row] && mappedData[row].length) {
const d = mappedData[row].shift();
result.push(d);
counter++;
}
row++;
if (row === mappedData.length) row = 0;
}
return result;
};
console.log(collect(queue));
// chunkSort(queue);