javascript - 过滤、映射、排序和连接

标签 javascript sorting filter concatenation

我觉得可能有更好的解决方案,因为我在以下例程(映射和排序)中重复了代码。

它是具有已读(1 或 null)和未读状态(0)的任意消息列表。我在顶部显示未读消息,在底部显示已读消息,并应用了一些排序和映射,然后在最后连接两个结果。

var unread = data.filter(function(item){
    return item.Read == 0;
}).map(function(item){
    return {Id: item.Id, First: item.First.toLowerCase(), Last: item.Last.toLowerCase()}
}).sort(function(a, b){
    if (a.Last < b.Last) return -1;
    if (a.Last > b.Last) return 1;
    return 0;
});

var read = data.filter(function(item){
    return item.Read == null || item.Read == 1;
}).map(function(item){ // lowercase (first, last) and sort the list by last
    return {Id: item.Id, First: item.First.toLowerCase(), Last: item.Last.toLowerCase()}
}).sort(function(a, b){
    if (a.Last < b.Last) return -1;
    if (a.Last > b.Last) return 1;
    return 0;
});

var finalData = unread.concat(read);

编辑

var input = [
    {Id: 1, First: "John", Last: "B", Read:0},
    {Id: 1, First: "Jane", Last: "C", Read:0},
    {Id: 1, First: "Doe", Last: "D", Read:1},
    {Id: 1, First: "Alpha", Last: "B", Read:1},
    {Id: 1, First: "Beta", Last: "C", Read:null},
    ];

var output = [
    {Id: 1, First: "Alpha", Last: "B", Read:1},
    {Id: 1, First: "Doe", Last: "D", Read:1},
    {Id: 1, First: "Beta", Last: "C", Read: null},
    {Id: 1, First: "John", Last: "B", Read:0}
    {Id: 1, First: "Jane", Last: "C", Read:0},
];

最佳答案

似乎您只想对多个字段进行排序。要首先按阅读状态排序,然后按姓氏排序,最后按名字排序(忽略大小写),您可以:

var data = [
  {Id: 1, First: "John", Last: "B", Read:0},
  {Id: 1, First: "Jane", Last: "C", Read:0},
  {Id: 1, First: "Doe", Last: "D", Read:1},
  {Id: 1, First: "Alpha", Last: "B", Read:1}
];

data.sort((a, b) =>
  b.Read !== a.Read
    ? b.Read - a.Read
    : a.Last.toLowerCase().localeCompare(b.Last.toLowerCase())
      ? a.Last.toLowerCase().localeCompare(b.Last.toLowerCase())
      : a.First.toLowerCase().localeCompare(b.First.toLowerCase()));
    
console.log(data);

更新

为了处理 Read 字段的 null 值(与直觉相反)被视为真实的事实,您必须引入几个临时变量 (let aRead = a.Read != null a.Read : 1) 并比较它们,或者按如下方式重写比较:

var data = [
  {Id: 1, First: "John", Last: "B", Read:0},
  {Id: 1, First: "Jane", Last: "C", Read:0},
  {Id: 1, First: "Doe", Last: "D", Read:1},
  {Id: 1, First: "Alpha", Last: "B", Read:1},
  {Id: 1, First: "Beta", Last: "C", Read:null}
];

data.sort((a, b) =>
  b.Read !== a.Read
    ? (b.Read != null ? b.Read : 1) - (a.Read != null ? a.Read : 1)
    : a.Last.toLowerCase().localeCompare(b.Last.toLowerCase())
      ? a.Last.toLowerCase().localeCompare(b.Last.toLowerCase())
      : a.First.toLowerCase().localeCompare(b.First.toLowerCase()));
    
console.log(data);

关于javascript - 过滤、映射、排序和连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43622721/

相关文章:

javascript - 自动刷新文本框值

javascript - JQuery 自动完成 - 自定义输出

asp.net - Objectdatasource和Gridview : Sorting, 分页、过滤

angularjs - 按多个属性进行 Angular 过滤并显示任何值是否等于搜索

scala - 使用正则表达式基于另一个 RDD 过滤一个 RDD

javascript - 如何在空后将可拖动元素重新附加到可放置元素

javascript - Phonegap Facebook Connect - 获取用户的生日和姓名

google-app-engine - GAE 搜索 API 排序

java - 按降序对 Firebase 数据进行排序

javascript - 如何使用 JavaScript 从数组数组创建简单数组?