具有未定义和空值的排序对象数组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了具有未定义和空值的排序对象数组相关的知识,希望对你有一定的参考价值。

如何使用javascript对具有空值和未定义值的对象数组进行排序。我的目标是首先显示具有“ jobTitle”属性的项目,然后按等级对它们进行排序,然后再对没有“ jobTitle”属性的项目进行按等级排序。数据:

data = [
  {name: 'John', rating: null},
  {name: 'Ethel', rating: 1.34, jobTitle: 'engineer'},
  {name: 'Abba', rating: 5.44},
  {name: 'Harry', rating: 0.44, jobTitle: 'plumber'}
]

在按jobTitle对数据进行排序,然后对其进行评级之后,应该像:

[
  {name: 'Ethel', rating: 1.34, jobTitle: 'engineer'},
  {name: 'Harry', rating: 0.44, jobTitle: 'plumber'},
  {name: 'Abba', rating: 5.44},
  {name: 'John', rating: null}
]

我尝试了许多类似的变体:

data.sort(function (a, b) {
  var x = a[key]; var y = b[key];
  return ((x > y) ? -1 : ((x < y) ? 1 : 0));
});

,但不适用于未定义和空值。我不想使用低质量的解决方案,例如创建新的数组,填充数据并合并它们。如果可能,我想用一种方法实现。

答案

如果a不是数字,则仅返回1;如果b不是数字,则返回-1,否则返回1-b

data = [
  {name: 'John', rating: null},
  {name: 'Ethel', rating: 1.34, jobTitle: 'engineer'},
  {name: 'Abba', rating: 5.44},
  {name: 'Harry', rating: 0.44, jobTitle: 'plumber'}
]
data.sort(({rating:a}, {rating:b}) => {
  if (typeof a !== 'number') return 1;
  if (typeof b !== 'number') return -1;
  return a-b;
});
console.log(data);
另一答案

在排序函数中,您可以检查值是null还是undefined,并在这种情况下返回1,因此将其排序到数组的末尾。附带说明:您正在排序数组,而不是JSON字符串。 JSON字符串有效时,不能包含undefined原语值。

data.sort(function (a, b) {
  var x = a[key];
  var y = b[key];
  if (x === null || x === undefined) {
    return 1;
  }
  return y - x;
});

以上是关于具有未定义和空值的排序对象数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在Java中解析具有空值的JSON对象?

Vuex mapstate 对象未定义和“[vuex] 未知突变类型:”

React 呈现未定义和更新的状态

成员变量 - 未定义和不可访问

比较未定义和错误的非常奇怪的行为

无法读取未定义和未处理的承诺拒绝的属性“捕获”