【问题标题】:Sort array of object javascript by attribute按属性对对象javascript数组进行排序
【发布时间】:2018-11-17 06:35:56
【问题描述】:

我有一个未排序的对象数组,具有 2 个相关属性:typedate。 我需要对这个数组进行排序:

  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))

但我找不到按类型排序的方法

【问题讨论】:

    标签: javascript sorting object data-structures


    【解决方案1】:

    您可以像下面这样使用“排序”。通过使用“localeCompare”,它将按升序对“type”进行排序——即“deposit”将在“withdrawl”之前,因为“d”在“w”之前

    那就用这个-

    i.sort((a,b) => ((+a.date) - (+b.date) || (a.type.localeCompare(b.type))))
    
    • 您首先按“日期”排序,如果日期相同,则进入 OR 条件(因为 a.date - b.date 将为 0)检查“类型”

    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)

    【讨论】:

    • 你能解释一下吗
    • @TSR 我添加了“排序”解释。如果有任何不清楚的地方,请告诉我。谢谢。
    【解决方案2】:

    您可以使用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】:

      虽然可能不是最佳解决方案,但我在 Array.prototype.sort 方法中将类型作为“a”和“b”的字符串连接到日期,并基于此对数组进行排序。

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

      希望有帮助!

      【讨论】:

        猜你喜欢
        • 2011-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-25
        • 1970-01-01
        • 1970-01-01
        • 2018-02-07
        相关资源
        最近更新 更多