Mar*_*ark 68 javascript arrays
grouperArray.sort(function (a, b) {
var aSize = a.gsize;
var bSize = b.gsize;
var aLow = a.glow;
var bLow = b.glow;
console.log(aLow + " | " + bLow);
return (aSize < bSize) ? -1 : (aSize > bSize) ? 1 : 0;
});
Run Code Online (Sandbox Code Playgroud)
所以上面的代码按gsize对数组进行排序 - 从最小到最大.它运作良好.但如果gsize是相同的,我希望它然后按发光排序.
谢谢.
小智 123
grouperArray.sort(function (a, b) {
return a.gsize - b.gsize || a.glow - b.glow;
});
Run Code Online (Sandbox Code Playgroud)
更短的版本
Chr*_*rle 83
grouperArray.sort(function (a, b) {
var aSize = a.gsize;
var bSize = b.gsize;
var aLow = a.glow;
var bLow = b.glow;
console.log(aLow + " | " + bLow);
if(aSize == bSize)
{
return (aLow < bLow) ? -1 : (aLow > bLow) ? 1 : 0;
}
else
{
return (aSize < bSize) ? -1 : 1;
}
});
Run Code Online (Sandbox Code Playgroud)
Vin*_*rth 18
grouperArray.sort((a, b) => a.gsize - b.gsize || a.glow - b.glow);
Run Code Online (Sandbox Code Playgroud)
甚至更短的版本使用箭头语法!
nih*_*ton 11
我意识到这是前段时间的问题,但我想我会添加我的解决方案.
此函数动态生成排序方法.只需提供每个可排序的子属性名称,前面加上+/-表示升序或降序.超级可重用,并且不需要知道有关您放在一起的数据结构的任何信息.可以做出白痴证明 - 但似乎没有必要.
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;}
}
}
}
Run Code Online (Sandbox Code Playgroud)
示例用法:
items.sort(getSortMethod(' - price','+ priority','+ name'));
这将以items最低的price第一个排序,并且具有最高的项目的关系priority.该项目打破了进一步的联系name
其中items是一个数组,如:
var items = [
{ name: "z - test item", price: "99.99", priority: 0, reviews: 309, rating: 2 },
{ name: "z - test item", price: "1.99", priority: 0, reviews: 11, rating: 0.5 },
{ name: "y - test item", price: "99.99", priority: 1, reviews: 99, rating: 1 },
{ name: "y - test item", price: "0", priority: 1, reviews: 394, rating: 3.5 },
{ name: "x - test item", price: "0", priority: 2, reviews: 249, rating: 0.5 } ...
];
Run Code Online (Sandbox Code Playgroud)
现场演示:http: //gregtaff.com/misc/multi_field_sort/
编辑:修复了Chrome的问题.
我希望三元运算符((aSize < bSize) ? -1 : (aSize > bSize) ? 1 : 0;)让你感到困惑.您应该查看链接以更好地理解它.
在那之前,这里是你的代码被吹成完整的if/else.
grouperArray.sort(function (a, b) {
if (a.gsize < b.gsize)
{
return -1;
}
else if (a.gsize > b.gsize)
{
return 1;
}
else
{
if (a.glow < b.glow)
{
return -1;
}
else if (a.glow > b.glow)
{
return 1;
}
return 0;
}
});
Run Code Online (Sandbox Code Playgroud)
这是针对那些可能需要更通用的东西,可以在任何数量的字段中使用的人的实现。
Array.prototype.sortBy = function (propertyName, sortDirection) {
var sortArguments = arguments;
this.sort(function (objA, objB) {
var result = 0;
for (var argIndex = 0; argIndex < sortArguments.length && result === 0; argIndex += 2) {
var propertyName = sortArguments[argIndex];
result = (objA[propertyName] < objB[propertyName]) ? -1 : (objA[propertyName] > objB[propertyName]) ? 1 : 0;
//Reverse if sort order is false (DESC)
result *= !sortArguments[argIndex + 1] ? 1 : -1;
}
return result;
});
}
Run Code Online (Sandbox Code Playgroud)
基本上,您可以指定任意数量的属性名称/排序方向:
var arr = [{
LastName: "Doe",
FirstName: "John",
Age: 28
}, {
LastName: "Doe",
FirstName: "Jane",
Age: 28
}, {
LastName: "Foo",
FirstName: "John",
Age: 30
}];
arr.sortBy("LastName", true, "FirstName", true, "Age", false);
//Will return Jane Doe / John Doe / John Foo
arr.sortBy("Age", false, "LastName", true, "FirstName", false);
//Will return John Foo / John Doe / Jane Doe
Run Code Online (Sandbox Code Playgroud)