JavaScript如何按照字符串属性对对象数组进行排序(不是升序或降序)?

5

您是否知道有没有一种方法可以使用sort()方法按特定属性对对象数组进行排序?在我的情况下,我希望首先按“香蕉”排序,然后是“梨”,最后是其余的。

const initialData = [
{ name: "strawberries", value: 12 },
{ name: "bananas", value: 3 },
{ name: "pears", value: 8 },
{ name: "pears", value: 7 },
{ name: "bananas", value: 10 },
{ name: "apples", value: 6 },
{ name: "bananas", value: 13 },
{ name: "bananas", value: 5 }
]

这就是我想要排序后数据的样子:
const sortedData = [
{ name: "bananas", value: 3 },
{ name: "bananas", value: 10 },
{ name: "bananas", value: 13 },
{ name: "bananas", value: 5 },
{ name: "pears", value: 8 },
{ name: "pears", value: 7 },
{ name: "strawberries", value: 12 },
{ name: "apples", value: 6 }
]

我知道这个函数可以将我的数据进行升序或降序排列:

initialData.sort(function(a, b) {
  if (a.name < b.name) {
    return -1;
  }
  if (a.name > b.name) {
    return 1;
  }
  return 0;
});

只需添加更多的条件来测试首先返回-1、1或0的其他条件。 - crashmstr
2
创建一个包含你期望值的数组,并按照适当的顺序排列,然后使用如何根据另一个数组的顺序对对象数组进行排序?JavaScript - 根据其子集中的另一个ID数组对ID数组进行排序 - Heretic Monkey
5个回答

8

您可以选择一个拥有所需顺序的对象,并将大值作为默认排序。

const
    data = [{ name: "strawberries", value: 12 }, { name: "bananas", value: 3 }, { name: "pears", value: 8 }, { name: "pears", value: 7 }, { name: "bananas", value: 10 }, { name: "apples", value: 6 }, { name: "bananas", value: 13 }, { name: "bananas", value: 5 }],
    order = { bananas: 1, pears: 2 };

data.sort((a, b) => (order[a.name] || Number.MAX_VALUE) - (order[b.name] || Number.MAX_VALUE));

console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }


2

您可以使用辅助数组来定义排序方案。以下是一个示例:

const sortingScheme = [
  "bananas",
  "pears",
  "strawberries",
  "apples"
]

initialData.sort((a, b) => {
  const indexOfa = sortingScheme.indexOf(a.name);
  const indexOfb = sortingScheme.indexOf(b.name);
  if (indexOfa > indexOfb)
    return 1
  if (indexOfa < indexOfb)
    return -1
  return 0;
})

只有当您知道数组可以容纳的所有名称时,此方法才有效。如果您只想对少数字段进行排序,则可以使用以下方法:

const orderedScheme = [
  "bananas",
  "pears"
]

initialData.sort((a, b) => {
  let indexOfa = orderedScheme.indexOf(a.name);
  let indexOfb = orderedScheme.indexOf(b.name);

  if (indexOfa < 0) indexOfa = orderedScheme.length;
  if (indexOfb < 0) indexOfb = orderedScheme.length;

  if (indexOfa > indexOfb)
    return 1
  if (indexOfa < indexOfb)
    return -1
  return 0;
})

这是因为如果元素不包含在“sortingScheme”数组中,indexOf()函数会返回-1,这会将元素放置在数组的开头。
我希望我对你有所帮助!

0

您可以使用此功能进行自定义排序:

initialData.sort(function(a, b) {
  var customSort="bpsacdefghijklmnoqrtuvwxyz";
  var aa=customSort.indexOf(a.substr(0,1));
  var bb=customSort.indexOf(b.substr(0,1));
  if (aa < bb) {
    return -1;
  }else if (aa > bb) {
    return 1;
  }else
    return 0;
});

根据以下字符进行排序:

var customSort="bpsacdefghijklmnoqrtuvwxyz";


0

排序方法,检查名称。当名称相同时按值排序。当名称不同时按名称排序。(请检查内联注释)

const initialData = [
  { name: "strawberries", value: 12 },
  { name: "bananas", value: 3 },
  { name: "pears", value: 8 },
  { name: "pears", value: 7 },
  { name: "bananas", value: 10 },
  { name: "apples", value: 6 },
  { name: "bananas", value: 13 },
  { name: "bananas", value: 5 },
];

initialData.sort((a, b) => {
  const order = ["pears", "bananas"]; // high priority items towards end.
  if (a.name === b.name && order.includes(a.name)) {
    return a.value - b.value;
  } else {
    // when item not in order, indexOf will return -1. 
    // Basically comparing the values -1, 0, 1
    return order.indexOf(b.name) - order.indexOf(a.name);
  }
});

console.log(initialData);


-1

你可以做到这一点

const initialData = [
    { name: "strawberries", value: 12 },
    { name: "bananas", value: 3 },
    { name: "pears", value: 8 },
    { name: "pears", value: 7 },
    { name: "bananas", value: 10 },
    { name: "apples", value: 6 },
    { name: "bananas", value: 13 },
    { name: "bananas", value: 5 }
    ]

    const data = initialData.sort(function(a, b) {
        if (a.name < b.name) {
            if(a.name === "apples") {
                return 1
            }
          return -1;
        }
        return 0;
      });
      console.log(data)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接