【问题标题】:Sort grouped array in asc/desc order [duplicate]按 asc/desc 顺序对分组数组进行排序[重复]
【发布时间】:2021-12-13 19:32:45
【问题描述】:

任何人都可以协助按升序/降序对以下数组进行排序吗?该数组将根据每个分组中的最高数字进行排序(使用品牌分组)。每组中的数字也要排序:

original_array = [
  { brand: "Ford",   number: "1", },
  { brand: "BMW",    number: "1", },
  { brand: "BMW",    number: "5", },
  { brand: "BMW",    number: "20",},
  { brand: "Toyota", number: "10",}
];

desc_order = [
  { brand: "BMW",    number: "20",},
  { brand: "BMW",    number: "5", },
  { brand: "BMW",    number: "1", },
  { brand: "Toyota", number: "10",},
  { brand: "Ford",   number: "1", }
];

asc_order = [
  { brand: "Ford",   number: "1", },
  { brand: "Toyota", number: "10",},
  { brand: "BMW",    number: "1", },
  { brand: "BMW",    number: "5", },
  { brand: "BMW",    number: "20",}
];

【问题讨论】:

标签: javascript arrays typescript sorting


【解决方案1】:

由于输出中品牌的顺序取决于其组中的最大值,我建议首先创建一个列出每个品牌的最大数量的对象。

然后使用它进行排序,使用以下排序顺序:

  • 首先是品牌的最大价值
  • 如果相同,则使用品牌名称(因为多个品牌的最大数量可能相同)
  • 如果相等,则按数字本身

实施:

const array = [ { brand: "Ford", number: "1", }, { brand: "BMW", number: "1", }, { brand: "BMW", number: "5", }, { brand: "BMW", number: "20", }, { brand: "Toyota", number: "10", } ];

// First collect the maximum values per brand as an aggregate:
const aggr = {};
for (let {brand, number} of array) { 
    aggr[brand] = Math.max(number, aggr[brand] ?? number);
}

// Ascending
array.sort((a, b) => aggr[a.brand] - aggr[b.brand] 
                  || a.brand.localeCompare(b.brand)
                  || a.number - b.number);
console.log(array);

// Descending
array.sort((a, b) => aggr[b.brand] - aggr[a.brand]
                  || b.brand.localeCompare(a.brand)
                  || b.number - a.number);
console.log(array);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-12
    • 2021-10-07
    • 2019-10-06
    • 2015-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多