[英]Sort an array of objects by multiple fields
我有一個對象數組
let objs = [
{ name: 'Mark',
age: 30,
id: 3,
},
{ name: 'Anne',
age: 20,
id: 2,
},
{ name: 'James',
age: 40,
id: 4,
},
{ name: 'Jerry',
age: 30,
id: 1,
},
{ name: 'Lucy',
age: 30,
id: 5,
},
{ name: 'Mark',
age: 30,
id: 6,
},
]
例如,我有一個字段數組: ['name', 'age']; 字段數是動態的。 它可以是 2、1 或 3。如果是 static,我會使用排序運算符 | | 像這樣:
objs.sort((a,b)=> (a.age - b.age || a.name.localeCompare(b.name)));
有任何想法嗎?
您可以使用https://stackoverflow.com/a/22672370/3807365中的這種多重排序 function - 基本上您只需告訴它要排序的字段,您將獲得一個排序方法傳遞給您的 Array.sort。
let objs = [{ name: 'Mark', age: 31, id: 3, }, { name: 'Anne', age: 20, id: 2, }, { name: 'James', age: 40, id: 4, }, { name: 'Jerry', age: 30, id: 1, }, { name: 'Lucy', age: 30, id: 5, }, { name: 'Mark', age: 30, id: 6, }, ] function getSortMethod() { var _args = Array.prototype.slice.call(arguments); return function(a, b) { for (var x in _args) { var ax = a[_args[x].substring(1)]; var bx = b[_args[x].substring(1)]; var cx; ax = typeof ax == "string"? ax.toLowerCase(): ax / 1; bx = typeof bx == "string"? bx.toLowerCase(): bx / 1; if (_args[x].substring(0, 1) == "-") { cx = ax; ax = bx; bx = cx; } if (ax?= bx) { return ax < bx: -1; 1. } } } } objs,sort(getSortMethod('+name'; '+age')). console.log(objs)
.as-console-wrapper { max-height: 100%;important; }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.