根据对象中的另一个变量对空值进行排序

时间:2019-04-09 18:12:02

标签: javascript

我正在尝试按升序对对象列表进行排序。但是在某些情况下,排序值为null,在这种情况下,该值应按字母顺序排序。

我试图创建以下代码:

let items = [
  {
   name: 'Foo',
   Km: null
  },
  {
   name: 'Bar',
   Km: 4
  },
  {
   name: 'BarFoo',
   Km: null
  },
  {
   name: 'FooBar',
   Km: 1
  },
]

function sortNullValues(values) {

    values.sort(function (a, b) {
    if(a.Km === null) return 1
    if(b.Km === null) return -1
    if (a.Km < b.Km) return 1
        if (a.Km < b.Km) return -1
    if (a.name > b.name) return -1
        if (a.name < b.name) return 1
  })

  return values
}

console.log(sortNullValues(items))

但是null值的对象不是按字母顺序排序的。 https://jsfiddle.net/am7n61ou/56/

当前输出:

[
  {
   name: 'Bar',
   Km: 4
  },
  {
   name: 'FooBar',
   Km: 1
  },
  {
   name: 'Foo',
   Km: null
  },
  {
   name: 'BarFoo',
   Km: null
  }
]

所需的输出:

[
  {
   name: 'FooBar',
   Km: 1
  },
  {
   name: 'Bar',
   Km: 4
  },
  {
   name: 'BarFoo',
   Km: null
  },
  {
   name: 'Foo',
   Km: null
  }
]

2 个答案:

答案 0 :(得分:4)

您可以先将Km的值排到最底,然后按null - nullvar array = [{ name: 'Foo', Km: null }, { name: 'Bar', Km: 4 }, { name: 'BarFoo', Km: null }, { name: 'FooBar', Km: 1 }]; array.sort((a, b) => (a.Km === null) - (b.Km === null) || a.Km - b.Km || a.name.localeCompare(b.name) ); console.log(array);为零)或字符串进行排序。

.as-console-wrapper { max-height: 100% !important; top: 0; }
{{1}}

答案 1 :(得分:0)

即使两个值都为null,您的函数也始终返回-1。 我已经修正了您的代码。您应该检查空值并返回不同的排序。

更正的代码:

  values.sort(function (a, b) {
    if (a.Km === null && b.Km === null) {
      if (a.name > b.name) return 1
      if (a.name < b.name) return -1
        }
    if(a.Km === null) return 1
    if(b.Km === null) return -1
    if (a.Km < b.Km) return 1
        if (a.Km < b.Km) return -1
  })