Javascript中按2个条件对数组排序不起作用
我想按id和名称对对象数组进行排序。首先,它应该按id按升序排序。然后,它应该按名称升序排序 排序函数Javascript中按2个条件对数组排序不起作用,javascript,jquery,arrays,sorting,object,Javascript,Jquery,Arrays,Sorting,Object,我想按id和名称对对象数组进行排序。首先,它应该按id按升序排序。然后,它应该按名称升序排序 排序函数 <script> $(document).ready(function() { var list = [{ "id": "ts1", "name": "TS1" }, { "id": "ts10", "name": "TS10" }, { "id": "ts11", "name":
<script>
$(document).ready(function() {
var list = [{
"id": "ts1",
"name": "TS1"
}, {
"id": "ts10",
"name": "TS10"
}, {
"id": "ts11",
"name": "TS11"
}, {
"id": "ts12",
"name": "TS12"
}, {
"id": "ts13",
"name": "TS2"
}, {
"id": "ts13",
"name": "TS1"
}, {
"id": "ts13",
"name": "TS3"
}, {
"id": "ts14",
"name": "TS14"
}, {
"id": "ts15",
"name": "TS15"
}, {
"id": "ts16",
"name": "TS16"
}, {
"id": "ts17",
"name": "TS17"
}, {
"id": "ts18",
"name": "TS18"
}, {
"id": "ts19",
"name": "TS19"
}, {
"id": "ts2",
"name": "TS2"
}, {
"id": "ts20",
"name": "TS20"
}, {
"id": "ts21",
"name": "TS21"
}, {
"id": "ts22",
"name": "TS22"
}, {
"id": "ts3",
"name": "TS3"
}, {
"id": "ts4",
"name": "TS4"
}, {
"id": "ts5",
"name": "TS5"
}, {
"id": "ts6",
"name": "TS6"
}, {
"id": "ts7",
"name": "TS7"
}]
list.sort(Sort_ID_Name);
console.log(list);
});
function Sort_ID_Name(a, b) {
try {
var aID = a.id.toLowerCase();
var bID = b.id.toLowerCase();
var aName = a.name.toLowerCase();
var bName = b.name.toLowerCase();
return ((aID < bID) ? -1 : ((aID > bID) ? 1 : ((aName < bName) ? -1 : ((aName > bName) ? 1 : 0))));
} catch (err) {}
}
</script>
理想状态是这样的
{id: "ts1", name: "TS1"}
{id: "ts2", name: "TS2"}
...
{id: "ts10", name: "TS10"}
{id: "ts11", name: "TS11"}
{id: "ts12", name: "TS12"}
{id: "ts13", name: "TS1"}
{id: "ts13", name: "TS2"}
{id: "ts13", name: "TS3"}
{id: "ts14", name: "TS14"}
{id: "ts15", name: "TS15"}
{id: "ts16", name: "TS16"}
....
该函数仅在列表很短时才起作用,但当列表很长时就不能正常工作。请参见现场演示-您可以使用自定义排序方法,通过指定
numeric:true
选项,它将智能识别数字
var list=[{“id”:“ts1”,“name”:“ts1”},{“id”:“ts10”,“name”:“ts10”},{“id”:“ts11”,“name”:“ts11”},{“id”:“ts12”,“name”:“TS13”},{“id”:“TS13”,“name”:“ts1”},{“id”:“TS13”,“name”:“ts1”},{“id”:“TS13”,“name”:“TS3”},{“id”:“ts14”},{“id”:“ts15”,“name”:“id”{“ts16”},{,{“id”:“ts17”,“name”:“ts17”},{“id”:“ts18”,“name”:“ts18”},{“id”:“ts19”,“name”:“ts19”},{“id”:“ts2”,“name”:“ts2”},{“id”:“ts20”,“name”:“ts20”},{“id”:“ts21”},{“id”:“ts22”,“name”:“ts22”},{“id”:“ts3”;“name”:“ts3”;“name”:“ts4”;“name”:“ts4”,{“id”:“id”:“ts5”{“tsid”:“ts5”},“名称”:“TS6”},{“id”:“ts7”,“名称”:“ts7”}];
list.sort((a,b)=>a.id.localeCompare(b.id,未定义,{numeric:true})| | a.name.localeCompare(b.name,未定义,{numeric:true}));
console.log(列表);
.as控制台包装{最大高度:100%!重要;顶部:0;}
您正在做的是>/与当前相比,它应该如何排序?@zfrisch请查看live demo。它应该按照结果列表的顺序排序,首先按ID排序,然后按名称排序。我问这个问题,因为我在演示中不清楚。ID和名称都是相同的?无论是否永久,它都应该用i来概括n您的问题不是外部的。@zfrisch请查看更新的演示,我更新了初始列表。您可以在这里发布更多代码吗?一些对象数组等?在这里发布代码不需要转到其他地方来回答。我知道使用`{numeric:true}的选项“但是我还没有看到也找不到关于未定义部分的文档。你能解释一下这到底是做什么的,或者给我指出正确的方向吗?我知道这很重要,因为这是一个成败攸关的交易,代码才能正常工作。除了@Matt的问题,localeCompare在比较时是否会自动转换成小写?@user8571142它没有。”I don’我不能从大写字母转换为小写字母。谢谢,所以如果我只想比较小写字母,那么我必须将它们设置为小写字母first@HassanImam你能在这里解释一下undefined
的用法吗?
{id: "ts1", name: "TS1"}
{id: "ts2", name: "TS2"}
...
{id: "ts10", name: "TS10"}
{id: "ts11", name: "TS11"}
{id: "ts12", name: "TS12"}
{id: "ts13", name: "TS1"}
{id: "ts13", name: "TS2"}
{id: "ts13", name: "TS3"}
{id: "ts14", name: "TS14"}
{id: "ts15", name: "TS15"}
{id: "ts16", name: "TS16"}
....
var aID = a.id.toLowerCase();
var bID = b.id.toLowerCase();
var aName = a.name.toLowerCase();
var bName = b.name.toLowerCase();
var reg = /\d+/; // matches 1 or more number characters
var aID = +a.id.match(reg)[0]; // unary + coerces to number
var bID = +b.id.match(reg)[0];
var aName = +a.name.match(reg)[0];
var bName = +b.name.match(reg)[0];