typescript 按固定格式的属性顺序对对象数组进行排序

h43kikqp  于 12个月前  发布在  TypeScript
关注(0)|答案(2)|浏览(155)

我需要按属性对一个对象数组进行排序,顺序如下:对于列表中的第一项:它是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]);
     }
    }

pvabu6sv

pvabu6sv1#

您可以定义一个对象,将这些字符串Map到数字,然后使用sort回调来比较这些数字:

const order = { "Camel": 1, "Absolute": 2, "Dream": 3, "Carnival": 4 };

const mySort = arr => arr.sort((a, b) => order[a.Name] - order[b.Name]); 

// Example runs
var items = [
    { 'Name':'Carnival', 'TypeId':3,  },
    { 'Name':'Camel', 'TypeId':55,  },
    { 'Name':'Dream', 'TypeId':4 , },
];
console.log(mySort(items));

items = [
    { 'Name':'Carnival', 'TypeId':3, },
    { 'Name':'Dream', 'TypeId':4 , },
    { 'Name':'Absolute', 'TypeId':114 , }
];
console.log(mySort(items));

字符串

izkcnapc

izkcnapc2#

要创建一个更优雅的解决方案,根据特定的顺序对对象数组进行排序,您可以利用自定义排序函数将名称Map到其所需的位置。这种方法利用sort()函数和预定义的顺序Map,使其简洁易读。
下面是一个例子:

function sortItems(items) {
  const orderMap = {
    'Camel': 1,
    'Absolute': 1,
    'Dream': 2,
    'Carnival': 3
  };

  return items.sort((a, b) => {
    let orderA = orderMap[a.Name] || Number.MAX_VALUE;
    let orderB = orderMap[b.Name] || Number.MAX_VALUE;

    // Handle tie-breaker for 'Camel' and 'Absolute'
    if (orderA === orderB && orderA === 1) {
      return a.Name === 'Camel' ? -1 : 1;
    }

    return orderA - orderB;
  });
}

// Example usage
var items = [{
    'Name': 'Carnival',
    'TypeId': 3
  },
  {
    'Name': 'Camel',
    'TypeId': 55
  },
  {
    'Name': 'Dream',
    'TypeId': 4
  }
];

var itemsSorted = sortItems(items);
console.log(itemsSorted);

字符串
这个解决方案使用了一个自定义的排序函数,并预先定义了一个orderMap来对对象数组进行排序。它使用一个tie-breaker来处理'Camel'和'Absolute'的特殊情况。与手动迭代和过滤数组相比,这种方法更简洁,更容易维护。

相关问题