代码之家  ›  专栏  ›  技术社区  ›  newbie

自定义排序对象数组

  •  2
  • newbie  · 技术社区  · 8 年前

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

    [ {
        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 回复  |  直到 8 年前
        1
  •  1
  •   Max    8 年前

    排序工作原理

    首先,让我们看看 .sort 希望你喂它。

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

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

    你是怎么分类的

    让我们看看你的第一行

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

    -1 意思是“a更小”但这可能不是真的可能是那个 a (不是 b )是-1,而且更大,但是我们总是告诉JavaScript发送 当我们应该这么做的时候 .

    相反,我们想回去 -1个 什么时候 是-1,但是 +1 什么时候 是-1如果他们都是-1,那我们返回什么并不重要。



    在JavaScript中,除了 0 是真实的让我们看看你的下一行。

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

    如果 a - b 是0,我们不返回 任何东西 在这次回拨中如果不是0,我们总是说a<b。

    注意,我们永远不会说b<a——所以如果发生这样的事件,我们就无法处理它,并且会对它进行错误的排序。

    如何正确排序

    获取ID

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

    -1个?

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

    哪个更大,

    如果你认为 -1个 ,然后我们可以简单地减去 甲-乙 . 为什么?如果 大于 ,则减法将创建一个正数,表示b<a。如果 小于 ,则减法将生成一个负数,即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。
    • 如果 不是真的,还你。

    是什么 (aID === -1)

    这意味着 true 如果援助是-1,并且 false 否则

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

    你怎么能减去 真的 ? 真的 将被解释为 1 ,和 作为 .

    援助=-1,投标=否

    这个值将是 1 - 0 ,或 +1个

    援助=不,投标=-1

    这个值将是 0 - 1 ,或 -1个

    援助=-1,投标=-1

    记住,如果两个值相同,我们返回什么并不重要

    援助=不,投标=不

    0 - 0 . 这是 . 这不是真实的价值所以我们进入 || 比特在这个答案中,第二位是 aID - bID ,如上所述它很聪明,很短,虽然可能没有可读性。

        2
  •  3
  •   Nina Scholz    8 年前

    您可以在函数中检查应该排序到底部的项。

    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; }