Javascript 对json数组排序,首先按搜索文本和剩余结果的字母顺序排序
我有一个json数组,我需要首先根据一些搜索文本对其进行缩写,然后按字母顺序进行缩写。所以基本上在下面的数组中,如果我搜索<强>“BeAU”< /强>从BAU开始的所有事物都应该保持在顶部(按字母顺序排序),剩下的结果也会按字母顺序排序(即使我们在文本中间的某处有搜索文本),并且应该在“”之后开始。 需要Javascript解决方案 数组:Javascript 对json数组排序,首先按搜索文本和剩余结果的字母顺序排序,javascript,arrays,json,sorting,Javascript,Arrays,Json,Sorting,我有一个json数组,我需要首先根据一些搜索文本对其进行缩写,然后按字母顺序进行缩写。所以基本上在下面的数组中,如果我搜索“BeAU”< /强>从BAU开始的所有事物都应该保持在顶部(按字母顺序排序),剩下的结果也会按字母顺序排序(即使我们在文本中间的某处有搜索文本),并且应该在“”之后开始。 需要Javascript解决方案 数组: [ { "value": "1", "text": "BEAUMONT Habitati
[
{
"value": "1",
"text": "BEAUMONT Habitation 54"
},
{
"value": "2",
"text": "BEAUMONT Place de Renival"
},
{
"value": "3",
"text": "BEAUMONT Rue des Tiennes"
},
{
"value": "4",
"text": "BEAUMONT Rue Grand Chemin"
},
{
"value": "5",
"text": "BRUYERES Chênes"
},
{
"value": "6",
"text": "CEROUX Cabine"
},
{
"value": "7",
"text": "CEROUX Chapelle aux Sabots"
},
{
"value": "8",
"text": "CEROUX Place Communale"
},
{
"value": "9",
"text": "CEROUX Quatre Bras"
},
{
"value": "10",
"text": "Station Jambeaux"
},
{
"value": "11",
"text": "Reseau Street"
},
{
"value": "12",
"text": "beaux street"
}
]
编辑
这很好,但在另一种情况下,我将这些数据转换成这样的形式,这种方式不起作用
{
"item":{
"value":"1558",
"text":"BEAUMONT Habitation 54"
},
"refIndex":0,
"matches":[
{
"indices":[
[
0,
1
]
],
"value":"BEAUMONT Habitation 54",
"key":"text"
}
],
"score":0.018533147937493524
},
{
"item":{
"value":"1560",
"text":"BEAUMONT Place de Renival"
},
"refIndex":3,
"matches":[
{
"indices":[
[
0,
1
]
],
"value":"BEAUMONT Place de Renival",
"key":"text"
}
],
"score":0.03162277660168379
}
]
为了让它工作,我对代码做了一些修改,但似乎不起作用
function sortByInput(data, input = null) {
if (!input) {
return data.sort((a, b) => a.item.text.localeCompare(b.item.text));
}
return data.sort((a, b) => {
const regex = new RegExp(`(^${input})`, "i");
const aMatch = regex.test(a.item.text);
const bMatch = regex.test(b.item.text);
if (aMatch || bMatch) return -aMatch + bMatch;
return a.item.text.localeCompare(b.item.text);
});
}
最基本的解决方案是使用默认的Javascript方法并传递您自己的比较函数
在下面的示例中,我检查是否有
输入
,并根据这一点,我只按字母顺序排序,或者按输入
排序(如果元素以输入
开头,则使用正则表达式进行检查),然后按字母顺序排序
const数据=[
{值:“1”,文本:“博蒙特居住区54”},
{价值:“2”,文字:“博蒙特雷尼瓦尔广场”},
{价值:“3”,文字:“博蒙特蒂安街”},
{值:“4”,文本:“博蒙特街大化工”},
{值:“5”,文本:“BRUYERES Chênes”},
{值:“6”,文本:“CEROUX Cabine”},
{值:“7”,文本:“CEROUX Chapelle aux Sabots”},
{值:“8”,文本:“CEROUX Place Communiale”},
{值:“9”,文本:“CEROUX Quatre Bras”},
{值:“10”,文本:“Jamboaux车站”},
{值:“11”,文本:“Reseau Street”},
{值:“12”,文本:“beaux street”}
];
函数sortByInput(数据,输入=null){
如果(!输入){
返回data.sort((a,b)=>a.text.localeCompare(b.text));
}
返回数据。排序((a,b)=>{
常量regex=newregexp(`(^${input})`,“i”);
常量aMatch=regex.test(a.text);
常量b匹配=正则表达式测试(b.text);
if(aMatch | | bMatch)返回-aMatch+bMatch;
返回a.text.localeCompare(b.text);
});
}
log(sortByInput([…数据],“ceroux”)代码>嘿,Johannes,谢谢你的回答,这似乎很好,但我有另一种情况,这不起作用,请检查编辑。我已经走了很长的路,但这似乎是一种更优化的方式来做它和工作,谢谢你有两组不同的数据,一个是仅包含值
和文本
的对象数组,另一个是包含值
和文本
的具有各种其他属性和项
的对象数组。我们应该尝试对哪组数据进行排序?嗨,Dane,我需要根据字母“text”的值对数组进行排序。例如,如果索引中的某个项的文本以“a”开头,则该索引的索引(0)应高于“b”(1),以此类推。在编辑中,您引用的是a.text,而不是a.item.text。这是一个拼写错误,已更改,但仍然不起作用