【问题标题】:Javascript sort an array of objects by field and sorting directionJavascript按字段和排序方向对对象数组进行排序
【发布时间】:2021-09-02 07:39:21
【问题描述】:

我有一个对象数组,例如:

const arr = [
  {
    name: 'John',
    age: 20,
  },
  {
    name: 'Mark',
    age: 30,
  },
  ...
]

我有一个服务调用,它有一个 order 参数,它是一个具有两个属性的对象:一个字段,它是我想要对我的对象数组进行排序的字段,以及一个“asc”,它是我的布尔值希望列表按升序或降序排列。

const order = {
   field: 'name',
   asc: true,
}

我会开始这样的事情,但它似乎不是解决方案

    orderedList = list.sort((a, b) => {
      if (order.asc) {
        return a[order.field] - b[order.field];
      } else {
        return b[order.field] - a[order.field];
      }
    });

【问题讨论】:

  • 减法技巧仅适用于数字(对于age),但对于字符串等,您必须使用>< 或通过其他方式进行比较。
  • 这可能会有所帮助:stackoverflow.com/a/1129270/2358409
  • 是的,我已经看到了,但是出于某种原因,我努力将我的“asc”属性实现为比较函数 - 今天早上我感到麻木,抱歉这个愚蠢的问题。最初我尝试这样:``` orderedList= list.sort((a, b) => { if (order.asc) { return a[order.field] > b[order.field] ? 1 : 0; } else { return a[order.field]
  • 这能回答你的问题吗? Sort array of objects by string property value
  • 我想我已经修好了,现在可以了。谢谢大家!

标签: javascript arrays sorting


【解决方案1】:

如果你想按字母顺序对字符串进行排序,你可以这样:

const arr = [{
    name: 'John',
    age: 20,
  },
  {
    name: 'Mark',
    age: 30,
  },
  {
    name: 'Luke',
    age: 19
  }
]
const order = {
  field: 'name',
  asc: true,
}

orderedList = arr.sort((a, b) => {
  if (order.asc) {
    if (a[order.field] > b[order.field]) {
      return 1
    } else if (a[order.field] < b[order.field]) {
      return -1
    } else {
      return 0
    }
  }
});
console.log(orderedList)

【讨论】:

    【解决方案2】:

    你可以这样写比较器函数:

    arr.sort((a, b) => {
        var ret;
        // assume ascending order and set return value to -1/0/1
        if (a[order.field] < b[order.field]) {
            ret = -1;
        } else if (a[order.field] > b[order.field]) {
            ret = 1;
        } else {
            ret = 0;
        }
        // for descending order simply invert the sign
        return order.asc ? ret : -ret;
    });
    // note that arr is sorted in-place
    

    【讨论】:

      猜你喜欢
      • 2015-03-11
      • 1970-01-01
      • 2011-05-16
      • 2014-10-01
      • 1970-01-01
      • 2014-07-10
      相关资源
      最近更新 更多