首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将自定义排序应用于类型记录中的对象数组

将自定义排序应用于类型记录中的对象数组
EN

Stack Overflow用户
提问于 2019-11-19 09:33:14
回答 4查看 982关注 0票数 3

我有一个对象数组,我想在我的角项目中应用自定义排序。

我想要实现的一个简单例子是,每个对象都具有属性idcategory

代码语言:javascript
运行
复制
let cars: { id: number, category: string }[] = [
    { "id": 3, "category": "fast car" },
    { "id": 0, "category": "fast car" },
    { "id": 1, "category": "slow car" },
    { "id": 2, "category": "fast car" }
];

不,我想对数组进行排序。首先,每个快速车应该出现(如果有多个按id排序),然后慢车(如果有多个排序按id)。

代码语言:javascript
运行
复制
{ "id": 0, "category": "fast car" }
{ "id": 2, "category": "fast car" }
{ "id": 3, "category": "fast car" }
{ "id": 1, "category": "slow car" }

我不太明白.sort函数是如何工作的。由于我对编程还不熟悉,在这种情况下,对如何使用.sort()进行相当详细的描述是有帮助的。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-11-19 10:14:39

解释:,因为您要求一个描述,所以我尽力首先尽可能简单地解释它:应用于数组的sort函数通常期望直接比较两个参数,并返回一个数字。这个数字可以被视为“小于”(负数)、“大于”(正)或“等于”(零)。因此,在您的情况下,函数将被多次调用。理论上,也有可能没有这两个参数,例如,对于随机顺序,您可以编写:cars.sort(() => Math.random() - 0.5)

因此,任何返回数字的函数都可以用来对数组进行排序。就你的情况而言,应该是:

按定义的类别/使用ID在相同类别的情况下进行排序:

代码语言:javascript
运行
复制
const cars: { id: number; category: string }[] = [
  { id: 3, category: "fast car" },
  { id: 0, category: "fast car" },
  { id: 1, category: "slow car" },
  { id: 2, category: "fast car" }
];

const orderCategory = { 'fast car': 1, 'slow car': 2 };

cars.sort((carA, carB) => {
  if (carA.category !== carB.category) {
    return orderCategory[carA.category] - orderCategory[carB.category];
  } else {
    return carA.id - carB.id;
  }
});

console.log(cars);

另外两项建议:

category

  • 您可以使用const而不是let,在您的例子中,
  • 您不必为idlet使用引号

我希望我的解释能帮到你!快乐编码

编辑:格式化代码。

编辑2:,我刚看到你想先列出快车。在我以前的实现中,这是因为字母顺序(F < S)。但是,如果字母顺序不是您希望首先列出它们的原因,那么您必须定义类别。你现在可以把“快车”改名为“跑车”(到处都是),然后先列出各自的车,而根据字母排序,它们会低于每辆“慢车”。

我刚刚更新了上面的代码。这是基于字母顺序的旧实现:

按字母顺序对类别进行排序/在同一类别中使用ID:

代码语言:javascript
运行
复制
cars.sort((carA, carB) => {
  if (carA.category < carB.category) {
    return -1;
  } else if (carA.category > carB.category) {
    return 1;
  }
  // same as: else if (carA.category === carB.category)
  else {
    return carA.id - carB.id;
  }
});

编辑3:调整随机排序示例在我的解释。Math.random()返回0到1之间的一个数字。因此,为了随机返回一个负数,我减除了0.5。

票数 2
EN

Stack Overflow用户

发布于 2019-11-19 09:40:39

可以创建自己的规则进行排序,然后只使用sort函数的vanilla JavaScript:

代码语言:javascript
运行
复制
let array = [
    { "id": 3, "category": "fast car" },
    { "id": 0, "category": "fast car" },
    { "id": 1, "category": "slow car" },
    { "id": 2, "category": "fast car" }
]

let order = { 'fast car': 1, 'slow car': 2};

array.sort(function (a, b) {
    return order[a.category] - order[b.category];
});

console.log(array);

票数 1
EN

Stack Overflow用户

发布于 2019-11-19 09:42:39

可以将自定义比较函数传递给数组的排序方法:

代码语言:javascript
运行
复制
cars.sort((a, b) => {
  // your custom logic here. 'a' stands for first item, 'b' - for second item and so on

  // the implementation can be like:
  if (a.category.startsWith('fast') && b.category.startsWith('slow')) {
    return 1; // 1 means positive number indicating that a > b
  } else if (a.category.startsWith('slow') && b.category.startsWith('fast') {
    return -1; // -1 - a negative number indicating a < b
  } else {
    // this block will be executed if both categories are 'slow' or 'fast'
    return a.id - b.id; // we are subtracting IDs to receive some number, either negative or positive. Depending on what number is returned the elements will be either replaced or not.
  }
})
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58930729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档