Javascript由两个字段sorting数组

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; }); 

所以上面的代码按gsizesorting – 从最小到最大。 它运作良好。 但是,如果gsize是相同的,我希望它然后通过发光sorting。

谢谢。

 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; } }); 
 grouperArray.sort(function (a, b) { return a.gsize - b.gsize || a.glow - b.glow; }); 

更短的版本

我期望三元运算符((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; } }); 

我意识到这是前一段时间问的,但我想我会加我的解决scheme。

这个函数dynamic地生成sorting方法。 只需提供每个可sorting的子属性名称,前缀+/-表示升序或降序。 超级可重用,而且不需要知道任何关于你放在一起的数据结构。 可以做出白痴certificate – 但似乎没有必要。

 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;} } } } 

示例用法:

items.sort(getSortMethod(' – price','+ priority','+ name'));

这将首先以最低的priceitems进行sorting,并且将关系发送到具有最高priority的项目。 进一步的关系被项目name打破

其中项目是一个数组,如:

 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 } ... ]; 

现场演示: http : //gregtaff.com/misc/multi_field_sort/

编辑:修正了Chrome的问题。

 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 : ( (aLow < bLow ) ? -1 : (aLow > bLow ) ? 1 : 0 ); }); 
 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 : (aLow < bLow) ? -1 : (aLow > bLow) ? 1 : 0); }); 

这里有一个实现的人可能想要更通用的东西,可以处理任何数量的领域。

 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; }); } 

基本上,你可以指定任何数量的属性名称/sorting方向:

 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 
 grouperArray.sort( function(a,b){return a.gsize == b.gsize ? a.glow - b.glow : a.gsize - b.gsize} ); 
 grouperArray.sort(function (a, b) { var aSize = a.gsize; var bSize = b.gsize; if (aSize !== aSize) return aSize - bSize; return a.glow - b.glow; }); 

没有testing,但我认为应该工作。

这是我用的

 function sort(a, b) { var _a = "".concat(a.size, a.glow); var _b = "".concat(b.size, b.glow); return _a < _b; } 

将这两个项目连接成一个string,并按string值sorting。 如果你想要,你可以用_parseInt来包装_a和_b,把它们作为数字进行比较,如果你知道它们是数字的话。

 grouperArray.sort((a, b) => a.gsize - b.gsize || a.glow - b.glow); 

使用箭头语法甚至更短的版本!