为了账号安全,请及时绑定邮箱和手机立即绑定

Javascript:按包含未定义的数字属性对对象数组进行排序

Javascript:按包含未定义的数字属性对对象数组进行排序

拉风的咖菲猫 2021-06-09 10:06:02
我可以定义一个数字数组并像这样对它们进行排序var array = ['2', undefined, '1'];array.sort((a, b) => a - b);console.log(array);输出是1, 2, null。我有一个可以包含数字属性的对象数组,我可以这样定义。并非所有对象都具有 number 属性。现在我想通过 number 属性对这个对象数组进行排序。所以我试过这个:var array = [  { number: 2 },  {},  { number: 1 }];array.sort((a, b) => a.number - b.number);console.log(array);输出不是我想要的。我明白了2, undefined, 1。如果数组中的所有对象都定义了 number 属性,则相同的排序函数会产生1, 2,这就是我期望的结果。var array = [  { number: 2 },  { number: 1 }];array.sort((a, b) => a.number - b.number);console.log(array);所以我的问题是,按属性对对象数组进行排序的最佳方法是什么,其中属性并不总是被定义。预期的结果是对象按属性(编号)排序,没有在数组末尾定义该属性的对象。到目前为止,我唯一的解决方案是迭代该集合,如果未定义该属性,则将该属性设置为 0 或null. 然后我可以将对象数组传递给 sort 函数,它可以按我的意愿工作。还有比这更好的方法吗?Jfiddle:https ://jsfiddle.net/t2r6z13e/1/
查看完整描述

3 回答

?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

您可以返回number被比较的每个对象上的属性是否存在之间的差异,或者返回它们number属性的差异(如果两个对象都具有所述属性):


var array = [

  { number: 2 },

  {},

  { number: 1 }

];


array.sort((a, b) => {

  const aHas = typeof a.number !== 'undefined';

  const bHas = typeof b.number !== 'undefined';

  return (bHas - aHas) || (aHas === true && a.number - b.number) || 0;

});

console.log(array);


查看完整回答
反对 回复 2021-06-11
?
慕姐8265434

TA贡献1813条经验 获得超2个赞

您可以为具有对象扩展的数组元素提供默认值: {default, ...item}


var array = [

  { number: 2 },

  {},

  { number: 1 },

  {},

  { number: 0 },

];


array.sort((a, b) => (

    {number: Number.MAX_VALUE, ...a}.number -

    {number: Number.MAX_VALUE, ...b}.number));


console.log(array);

如果您的目标尚不支持对象扩展,请将其替换为Object.assign.


查看完整回答
反对 回复 2021-06-11
?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

解释在评论中:


let array = [

  {},

  { number: 2 },

  {},

  { number: 1 }

];


array.sort((a, b) => {

  // two undefined values should be treated as equal ( 0 )

  if( typeof a.number === 'undefined' && typeof b.number === 'undefined' )

    return 0;

  // if a is undefined and b isn't a should have a lower index in the array

  else if( typeof a.number === 'undefined' )

    return 1;

    // if b is undefined and a isn't a should have a higher index in the array

  else if( typeof b.number === 'undefined' )

    return -1;

    // if both numbers are defined compare as normal

  else

    return a.number - b.number;

});


console.log( array );


查看完整回答
反对 回复 2021-06-11
  • 3 回答
  • 0 关注
  • 139 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信