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

我可以定义一个数字数组并像这样对它们进行排序


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/


拉风的咖菲猫
浏览 140回答 3
3回答

小唯快跑啊

您可以返回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);

慕姐8265434

您可以为具有对象扩展的数组元素提供默认值: {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.

ABOUTYOU

解释在评论中: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 );
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript