【问题标题】:JS sort array of objets by specific string property (not ascending or descending)JS按特定字符串属性对对象数组进行排序(不升序或降序)
【发布时间】:2021-04-17 15:11:20
【问题描述】:

您知道是否有一种方法可以使用 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;
});

【问题讨论】:

标签: javascript arrays sorting


【解决方案1】:

您可以采用所需顺序的对象,并采用较大的值作为默认排序。

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,这会将元素放在数组的开头。

    希望对你有用!

    【讨论】:

      【解决方案3】:

      您可以将其用于自定义排序:

      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";

      【讨论】:

        【解决方案4】:

        排序方法,检查名称。当名称按值顺序排列时。当名称不相等时,按名称排序。 (检查内联 cmets)

        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);

        【讨论】:

          【解决方案5】:

          你可以这样做

          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)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-11-21
            • 2021-06-27
            相关资源
            最近更新 更多