按排序顺序优先级对对象数组进行排序

问题描述 投票:0回答:1

我想要按照排序优先级文本给出的特定顺序对对象数组进行排序。

var sortPriority = "ramoklyxq";

items[
0:{data: "aizak", level: 'z'}
1:{data: "alice", level: 'r'}
2:{data: "bob", level: 'a'}
3:{data: "trinity", level: 'm'}
4:{data: "ella", level: 'z'}
5:{data: "John", level: 'z'}
6:{data: "bryan", level: 'z'}
7:{data: "sam", level: 'o'}
8:{data: "nick", level: 'k'}
9:{data: "angel", level: 'l'}
10:{data: "arla", level: 'z'}
11:{data: "marley", level: 'o'}
etc
]

i want to return as:

items[
0:{data: "alice", level: 'r'}
1:{data: "bob", level: 'a'}
2:{data: "trinity", level: 'm'}
3:{data: "marley", level: 'o'}
4:{data: "sam", level: 'o'}
5:{data: "nick", level: 'k'}
6:{data: "angel", level: 'l'}
7:{data: "aizak", level: 'z'}
8:{data: "arla", level: 'z'}
9:{data: "bryan", level: 'z'}
10:{data: "ella", level: 'z'}
11:{data: "John", level: 'z'}
etc
]

有没有办法按 data.level 顺序从 sortPriority 级别对列表进行排序。 如果 sortPriority 中不存在级别,则会添加到后面,如返回示例所示。

我首先使用此函数按级别排序,然后再按数据排序。

    for (let i = 0; i < items.length; i++) {
        var list = document.getElementById('holder');
        [...list.children]
            .sort((a, b) => a.data.level > b.data.level ? 1 : -1)
            .forEach(node => list.appendChild(node));
        for (let j = 0; j < items.length; j++) {
            var list = document.getElementById('holder');
            [...list.children]
                .sort((a, b) => a.data.data > b.data.data ? 1 : -1)
                .forEach(node => list.appendChild(node));
        }
    }

我需要类似这个函数的正确结果,这样我就可以将其附加到列表中,如图所示

提前致谢。

javascript sorting
1个回答
0
投票

您可以获取一个对象作为订单并相应地排序。

const
    sortPriority = "ramoklyxq",
    data = [{ data: "aizak", level: 'z' }, { data: "alice", level: 'r' }, { data: "bob", level: 'a' }, { data: "trinity", level: 'm' }, { data: "ella", level: 'z' }, { data: "John", level: 'z' }, { data: "bryan", level: 'z' }, { data: "sam", level: 'o' }, { data: "nick", level: 'k' }, { data: "angel", level: 'l' }, { data: "arla", level: 'z' }, { data: "marley", level: 'o' }],
    order = Object.fromEntries([...sortPriority].map((c, i) => [c, i + 1]));

data.sort(({ level: a }, { level: b }) => (order[a] || Infinity) - (order[b] || Infinity));

console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }

© www.soinside.com 2019 - 2024. All rights reserved.