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'));
这将首先以最低的price
对items
进行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);
使用箭头语法甚至更短的版本!