如何使用JavaScript排序对多个列进行排序?

如何使用JavaScript排序对多个列进行排序?,javascript,arrays,sorting,custom-sort,Javascript,Arrays,Sorting,Custom Sort,我有以下数组需要根据搜索文本“John”进行排序 {id: 1, firstName: 'User', lastName: 'John', nickName: 'Smith'}, {id: 2, firstName: 'Test', lastName: 'John', nickName: 'Andrew'}, {id: 3, firstName: 'Test', lastName: 'Zch', nickName: 'John'}, {id: 4, firstName: 'Tes

我有以下数组需要根据搜索文本“John”进行排序

  {id: 1, firstName: 'User', lastName: 'John', nickName: 'Smith'},
  {id: 2, firstName: 'Test', lastName: 'John', nickName: 'Andrew'},
  {id: 3, firstName: 'Test', lastName: 'Zch', nickName: 'John'},
  {id: 4, firstName: 'Test', lastName: 'Mason', nickName: 'John'},
  {id: 5, firstName: 'John', lastName: 'Doe'},


];
预期输出:

数组应首先按昵称(带搜索文本)排序,然后按姓氏(带搜索文本)排序。若昵称不存在,那个么它应该按照ASC排序顺序相对于firstName(带有搜索文本)进行排序。 注意:应考虑搜索文本词为“强”>“约翰”<强>

这种排序类似于手机联系人应用程序中的搜索排序

[
  // sort with nickName as higher relevance considering search text as John
  {id: 4, firstName: 'Test', lastName: 'Mason', nickName: 'John'},
  {id: 3, firstName: 'Test', lastName: 'Zch', nickName: 'John'},
  // sort with lastName considering search text
  {id: 2, firstName: 'Test', lastName: 'John', nickName: 'Andrew'},
  {id: 1, firstName: 'User', lastName: 'John', nickName: 'Smith'},
  // sort  with firstName as nickName is null
  {id: 5, firstName: 'John', lastName: 'Doe'},



];
我试过本地方法

function sortByLocale(user1, user2) {
   var sortByNickName = user1.nickName.toLowerCase().localeCompare(user2.nickName.toLowerCase());
   var sortByLastName = user1.lastName.toLowerCase().localeCompare(user2.lastName.toLowerCase());

   return sortByNickName || sortByLastName;
}
但结果是排序时没有考虑搜索文本。 我看到的一种方法是创建三个不同的数组并对它们进行排序,然后将这些排序后的数组组合起来 任何帮助都将不胜感激


编辑:不考虑搜索文本值不匹配的对象

您可以对想要的顺序进行两次迭代

  • 一个是通缉犯
  • 为了其他人
  • var data=[{id:1,名字:“User”,姓氏:“John”,昵称:“Smith'},
    {id:2,名:“Test”,姓“John”,昵称“Andrew”},
    {id:3,名字:'Test',姓氏:'Zch',昵称:'John'},
    {id:4,名字:'Test',姓氏:'Mason',昵称:'John'},
    {id:5,姓:“约翰”,姓:“多伊”}
    ],
    search='john',
    check=(s=>(o,k)=>(o[k]| |“”).toLowerCase()==search)(search),
    keys=[“昵称”、“姓氏”、“名字”];
    数据排序((a,b)=>{
    常数
    fns=[
    k=>d=检查(b,k)-检查(a,k),
    k=>d=(a[k]| |'')。本地比较(b[k]| |'')
    ];
    设d=0;
    一些(fn=>keys.some(fn));
    返回d;
    });
    控制台日志(数据)
    
    .as控制台包装{max height:100%!important;top:0;}
    只需按名称添加第一个搜索

    function checkSearch (value)  {
       return (value.nickName === 'John') * -3 ||
          (value.lastName === 'John') * -2 ||
          (value.firstName === 'John') * -1 ||
          0
    }
    
    function sortByLocale(user1, user2) {
       var sortBySearch = checkSearch(user1) - checkSearch(user2)
    
       var sortByNickName = (user1.nickName || '').toLowerCase().localeCompare((user2.nickName || '').toLowerCase());
       var sortByLastName = user1.lastName.toLowerCase().localeCompare(user2.lastName.toLowerCase());
    
       return sortBySearch || sortByNickName || sortByLastName;
    }
    

    传递给
    sort
    的compare函数要求返回一个数字,而不是布尔值。@Olian04,localeCompare返回数字,因此在这种情况下,一切都是正确的,但实际上我读了3遍,没有得到他想要的排序方式=)@dmitryrutov排序方式就像它在联系人中的工作方式一样。若你们在搜索框中输入John,那个么它会按照ASC的顺序显示所有的John,包括名字和姓氏。然后,一旦完成了对名字的排序,那么它将显示所有记录,其中John的姓氏和名字将在ASC中order@ShoaibChikate,是的,最后我得到并发布了解决方案,请检查…但不要过滤掉您在示例中提供的非搜索文本。感谢您提供完美、干净的解决方案投票表决解决方案。非常感谢。