例如,我有一个对象数组:
[ {
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移到数组的后面。
为什么会这样?我在做什么错了?
答案 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 如果您假设 缩短内容可能会有所帮助。 @Nina Scholz的另一个答案很有帮助,显示了一个简短得多的版本。我认为解释一下为什么会有用。 如果aID为-1,则表示 如何减去 此值为 此值为 请记住,如果两个值相同,我们返回什么都没关系 如何正确排序
获取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
a
和b
不是 -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);
高尔夫
return (a.id === '-1') - (b.id === '-1') || a.id - b.id
什么是
x || y
x || y
的意思是:
x
是真实的,则返回x。x
不真实,请返回y。什么是
(aID === -1)
true
,否则为false
什么是
(aID === -1) - (bID === -1)
true
和false
? true
将被解释为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
。它很聪明也很短,尽管可能不那么可读。