我需要按属性对一个对象数组进行排序,顺序如下:对于列表中的第一项:它是Camel或Absolute对于列表中的第二项:它必须是Dream,对于列表中的第三项:它必须是Carnival
[Camel, Dream, Carnival] or [Absolute, Dream, Carnival]
字符串
示例1:给定
var items = [
{ 'Name':'Carnival', 'TypeId':3, ... },
{ 'Name':'Camel', 'TypeId':55, ... },
{ 'Name':'Dream', 'TypeId':4 , ...},
]
型
它应该返回:
var itemsSorted = [{ 'Name':'Camel', 'TypeId':55, ... },
{ 'Name':'Dream', 'TypeId':4, ... },
{ 'Name':'Carnival', 'TypeId':3, ... }]
型
实施例2:给定
var items = [
{ 'Name':'Carnival', 'TypeId':3, ... },
{ 'Name':'Dream', 'TypeId':4 , ...},
{ 'Name':'Absolute', 'TypeId':114 , ...}]
型
它应该返回:
var itemsSorted = [{ 'Name':'Absolute', 'TypeId':114, ... },
{ 'Name':'Dream', 'TypeId':4, ... },
{ 'Name':'Carnival', 'TypeId':3, ... }]
型
我的尝试,但我想知道是否有任何其他的解决方案,是更优雅的,你可以推荐?
private _setUpdateProgress() {
const order = ['Camel', 'Absolute', 'Dream', 'Carnival'];
this.itemsSorted = [];
if (this.items?.length) {
for (let i = 0; i < order.length; i++) {
if (i === 1) {
continue;
}
let info!: Array<any>;
if (i === 0) {
info = items.filter(x => x.Name ===
order[0] || x.Name === order[1]);
}
if (i > 1) {
info = items.filter(x => x.Name===
order[i]);
}
this.itemsSorted.push(info[0]);
}
}
型
2条答案
按热度按时间pvabu6sv1#
您可以定义一个对象,将这些字符串Map到数字,然后使用
sort
回调来比较这些数字:字符串
izkcnapc2#
要创建一个更优雅的解决方案,根据特定的顺序对对象数组进行排序,您可以利用自定义排序函数将名称Map到其所需的位置。这种方法利用
sort()
函数和预定义的顺序Map,使其简洁易读。下面是一个例子:
字符串
这个解决方案使用了一个自定义的排序函数,并预先定义了一个
orderMap
来对对象数组进行排序。它使用一个tie-breaker来处理'Camel'和'Absolute'的特殊情况。与手动迭代和过滤数组相比,这种方法更简洁,更容易维护。