如何使用JavaScript排序对多个列进行排序?
我有以下数组需要根据搜索文本“John”进行排序如何使用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
{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,是的,最后我得到并发布了解决方案,请检查…但不要过滤掉您在示例中提供的非搜索文本。感谢您提供完美、干净的解决方案投票表决解决方案。非常感谢。