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

按属性对对象javascript数组排序

  •  0
  • TSR  · 技术社区  · 7 年前

    我有一个未排序的对象数组,它有两个相关属性: type 和 date . 我需要对这个数组进行排序:

    1. 按日期和
    2. 按类型(每年, deposit 应该先走 withdrawal )

    以下是输入示例:

    let i = [
        {
            date:'2017',
            type:'withdrawal',
            amount:-5
        },
        {
            date:'2016',
            type:'deposit',
            amount:12
        },
        {
            date:'2018',
            type:'deposit',
            amount:54
        },
        {
            date:'2017',
            type:'deposit',
            amount:20
        },
        {
            date:'2016',
            type:'withdrawal',
            amount:55
        },
        {
            date:'2018',
            type:'withdrawal',
            amount:54
        }
    ]  
    

    目标是输出如下内容:

    let o = [
        {
            date:'2016',
            type:'deposit',
            amount:12
        },
        {
            date:'2016',
            type:'withdrawal',
            amount:55
        },
        {
            date:'2017',
            type:'deposit',
            amount:20
        },
        {
            date:'2017',
            type:'withdrawal',
            amount:-5
        },
        {
            date:'2018',
            type:'deposit',
            amount:54
        },
        {
            date:'2018',
            type:'withdrawal',
            amount:54
        }
    ]
    

    到目前为止,我设法使用以下方法按日期对数组进行排序:

    o = i.sort((a,b)=>(a.date - b.date))
    

    但我找不到按类型分类的方法

    3 回复  |  直到 7 年前
        1
  •  3
  •   Nitish Narang    7 年前

    i.sort((a,b) => ((+a.date) - (+b.date) || (a.type.localeCompare(b.type))))
    

    let i = [
        {
            date:'2017',
            type:'withdrawal',
            amount:-5
        },
        {
            date:'2016',
            type:'deposit',
            amount:12
        },
        {
            date:'2018',
            type:'deposit',
            amount:54
        },
        {
            date:'2017',
            type:'deposit',
            amount:20
        },
        {
            date:'2016',
            type:'withdrawal',
            amount:55
        },
        {
            date:'2018',
            type:'withdrawal',
            amount:54
        }
    ]  
    
    i.sort((a,b) => ((+a.date) - (+b.date) || (a.type.localeCompare(b.type))))
    
    console.log(i)
        2
  •  0
  •   Hassan Imam Ravi kant    7 年前

    string#localCompare date type

    let arr = [ { date:'2017', type:'withdrawal', amount:-5 }, { date:'2016', type:'deposit', amount:12 }, { date:'2018', type:'deposit', amount:54 }, { date:'2017', type:'deposit', amount:20 }, { date:'2016', type:'withdrawal', amount:55 }, { date:'2018',type:'withdrawal', amount:54 } ];
    arr.sort((a,b) => a.date.localeCompare(b.date) || a.type.localeCompare(b.type));
    console.log(arr);
        3
  •  0
  •   Gabor Szekely    7 年前

    i.sort((a,b) => {
      let aStr = `${a.date}${a.type}`;
      let bStr = `${b.date}${b.type}`;
      if(aStr > bStr) {
        return 1;
      } else if(aStr === bStr) {
        return 0;
      } else {
        return -1;
      }
    });