admin管理员组文章数量:1309263
I have this array of objects:
var eventList = [
{
eventName: "abc",
status: "pleted"
},
{
eventName: "def",
status: "live"
},
{
eventName: "ghi",
status: "live"
},
{
eventName: "jkl",
status: "uping"
},
]
I want to sort these array of objects using a priority array of a specific key, say ["live", "uping", "pleted"]
for status, meaning all live events e first, followed by uping followed by pleted. Answers all over the internet seem like you can only sort array objects using keys as ascending or descending. How to I approach this?
I have this array of objects:
var eventList = [
{
eventName: "abc",
status: "pleted"
},
{
eventName: "def",
status: "live"
},
{
eventName: "ghi",
status: "live"
},
{
eventName: "jkl",
status: "uping"
},
]
I want to sort these array of objects using a priority array of a specific key, say ["live", "uping", "pleted"]
for status, meaning all live events e first, followed by uping followed by pleted. Answers all over the internet seem like you can only sort array objects using keys as ascending or descending. How to I approach this?
2 Answers
Reset to default 10You could do it using Array.prototype.sort()
method with an ordering array.
const eventList = [
{
eventName: 'abc',
status: 'pleted',
},
{
eventName: 'def',
status: 'live',
},
{
eventName: 'ghi',
status: 'live',
},
{
eventName: 'jkl',
status: 'uping',
},
];
const order = ['live', 'uping', 'pleted'];
eventList.sort((x, y) => order.indexOf(x.status) - order.indexOf(y.status));
console.log(eventList);
If you would want to make index searching faster when sorting you could use Map Object
.
const eventList = [
{
eventName: 'abc',
status: 'pleted',
},
{
eventName: 'def',
status: 'live',
},
{
eventName: 'ghi',
status: 'live',
},
{
eventName: 'jkl',
status: 'uping',
},
];
const order = ['live', 'uping', 'pleted'];
const map = new Map();
order.forEach((x, i) => map.set(x, i));
eventList.sort((x, y) => map.get(x.status) - map.get(y.status));
console.log(eventList);
You can do this without sorting for a linear time plexity by first grouping your array based on status
, and then using .flatMap()
on your order array. For each value in the ordered array, you can grab the grouped value from the grouping in O(1) (ie: instantly), and map those grouped objects. As you're using flatMap these grouped objects will be flattened into the resulting array:
const eventList = [ { eventName: "abc", status: "pleted" }, { eventName: "def", status: "live" }, { eventName: "ghi", status: "live" }, { eventName: "jkl", status: "uping" }, ];
const order = ["live", "uping", "pleted"];
const grouped = eventList.reduce(
(map, o) => map.set(o.status, (map.get(o.status) || []).concat(o)), new Map
);
const result = order.flatMap(status => grouped.get(status) || []);
console.log(result);
本文标签: nodejsJavascript sort array of objects using array of priorityStack Overflow
版权声明:本文标题:node.js - Javascript sort array of objects using array of priority - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1741843792a2400659.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论