首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按属性排序对象javascript数组

按属性排序对象javascript数组
EN

Stack Overflow用户
提问于 2018-11-17 06:35:56
回答 3查看 83关注 0票数 0

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

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

下面是一个输入示例:

代码语言:javascript
复制
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
    }
]  

目标是输出类似这样的内容:

代码语言:javascript
复制
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
    }
]

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

代码语言:javascript
复制
o = i.sort((a,b)=>(a.date - b.date))

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-11-17 06:39:05

你可以像下面这样使用“排序”。通过使用"localeCompare“,它将按递增的顺序对”类型“进行排序,即”存款“在”取款“之前,而"d”则在"w“之前。

就是用这个-

代码语言:javascript
复制
i.sort((a,b) => ((+a.date) - (+b.date) || (a.type.localeCompare(b.type))))
  • 首先按“日期”排序,如果日期相同,则在OR条件下( a.date - b.date将为0)检查“类型”。

代码语言:javascript
复制
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)

票数 3
EN

Stack Overflow用户

发布于 2018-11-17 06:58:09

可以使用string#localCompare对数组进行排序,首先是基于date,然后是基于type

代码语言:javascript
复制
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);

票数 0
EN

Stack Overflow用户

发布于 2018-11-17 07:13:45

虽然可能不是最理想的解决方案,但我将类型作为Array.prototype.sort方法中"a“和"b”的字符串连接到date上,并根据该字符串对数组进行排序。

代码语言:javascript
复制
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;
  }
});

希望这能帮上忙!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53348869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档