自定义对象排序数组

时间:2018-07-22 09:35:57

标签: javascript arrays javascript-objects

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

[ {
    id: '-1'
},
{
    id: '10'
},
{
    id: '1234'
},
{
    id: '1235'
},
{
    id: '-1'
} ]

我想对这个数组进行排序,以便按ID升序排列(从最小到最大),但是我希望将ID为“ -1”的对象发送到数组的后面。所以我尝试了这个:

const arr = [ {	id: '-1' }, { id: '10'}, { id: '1234' }, { id: '1235' }, { id: '-1' } ]
arr.sort((a, b) => {
	if (parseInt(a.id) === -1 || parseInt(b.id) === -1) return 1;
	if (parseInt(a.id) - parseInt(b.id)) return -1;
});
console.log(arr);

从上面的代码片段中可以看到,它成功地对它们进行了升序排序,但是并没有成功地将带有“ -1”的id移到数组的后面。

为什么会这样?我在做什么错了?

2 个答案:

答案 0 :(得分:3)

使用此功能时,应检查应该排序到底部的项目。

var array = [{ id: '-1' }, { id: '10' }, { id: '1234' }, { id: '1235' }, { id: '-1' }];

array.sort((a, b) => (a.id === '-1') - (b.id === '-1') || a.id - b.id);

console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:1)

排序方式

首先,让我们看一下.sort对您的期望。

给定参数(a, b)-我们应该返回

  • < 0,如果
  • > 0(如果a> b

您如何进行分类

让我们看看您的第一行

if (parseInt(a.id) === -1 || parseInt(b.id) === -1) return 1;

-1表示“ a较小”。但这可能不正确。可能a(不是b)是-1,并且更大,但是我们总是告诉JavaScript将a发送到后面,这是我们应该做的。 b

相反,我们希望在-1为-1时返回b,而在+1为-1时返回a。如果它们都为-1,我们返回什么并不重要。



在JavaScript中,除0以外的任何数字都是真实的。让我们看看您的下一行。

if (parseInt(a.id) - parseInt(b.id)) return -1;

如果a - b为0,则此回调中不返回任何内容。如果不是0,我们总是说a

请注意,我们永远不会说b

如何正确排序

获取ID

const aID = parseInt(a.id)
const bID = parseInt(b.id)

a还是b -1?

if(aID === -1) return +1;
if(bID === -1) return -1;

哪个更大,a还是b

如果您假设ab不是 -1,那么我们可以简单地减去a - b。为什么?如果a大于b,则减法将产生一个正数,表示b a小于b,则减法将创建一个负数,表示

return aID - bID

在一起

const arr = [ {	id: '-1' }, { id: '10'}, { id: '1234' }, { id: '1235' }, { id: '-1' } ]
arr.sort((a, b) => {
	const [aID, bID] = [parseInt(a.id), parseInt(b.id)]
  if(aID === -1) return +1
  if(bID === -1) return -1
  return aID - bID
});
console.log(arr);

高尔夫

缩短内容可能会有所帮助。 @Nina Scholz的另一个答案很有帮助,显示了一个简短得多的版本。我认为解释一下为什么会有用。

return (a.id === '-1') - (b.id === '-1') || a.id - b.id

什么是x || y

x || y的意思是:

  • 如果x是真实的,则返回x。
  • 如果x不真实,请返回y。

什么是(aID === -1)

如果aID为-1,则表示true,否则为false

什么是(aID === -1) - (bID === -1)

如何减去truefalsetrue将被解释为1,而false将被解释为0

aID = -1,bID =否

此值为1 - 0+1

aID =否,bID = -1

此值为0 - 1-1

aID = -1,bID = -1

请记住,如果两个值相同,我们返回什么都没关系

aID =否,bID =否

0 - 0。这是0。这不是一个真实的价值。因此,我们进入了||位。如上所述,该答案的第二位为aID - bID。它很聪明也很短,尽管可能不那么可读。