JavaScript对象数组如何按指定属性和排序方向进行(2)

function SortByProps(item1, item2) { "use strict"; var props = []; for (var _i = 2; _i < arguments.length; _i++) { props[_i - 2] = arguments[_i]; } var cps = []; // 存储排序属性比较结果。 // 如果未指定排序属性,则按照全属性升序排序。 var asc = true; if (props.length < 1) { for (var p in item1) { if (item1[p] > item2[p]) { cps.push(1); break; // 大于时跳出循环。 } else if (item1[p] === item2[p]) { cps.push(0); } else { cps.push(-1); break; // 小于时跳出循环。 } } } else { for (var i = 0; i < props.length; i++) { var prop = props[i]; for (var o in prop) { asc = prop[o] === "asc"; if (item1[o] > item2[o]) { cps.push(asc ? 1 : -1); break; // 大于时跳出循环。 } else if (item1[o] === item2[o]) { cps.push(0); } else { cps.push(asc ? -1 : 1); break; // 小于时跳出循环。 } } } } for (var j = 0; j < cps.length; j++) { if (cps[j] === 1 || cps[j] === -1) { return cps[j]; } } return 0; }

测试用例

// -------------测试用例------------------------------ var items = [ { name: 'Edward', value: 21 }, { name: 'Sharpe', value: 37 }, { name: 'And', value: 45 }, { name: 'Edward', value: -12 }, { name: 'Magnetic', value: 21 }, { name: 'Zeros', value: 37 } ]; function test(propOrders) { items.sort(function (a, b) { return SortByProps(a, b, propOrders); }); console.log(items); } function testAsc() { test({ "name": "asc", "value": "asc" }); } function testDesc() { test({ "name": "desc", "value": "desc" }); } function testAscDesc() { test({ "name": "asc", "value": "desc" }); } function testDescAsc() { test({ "name": "desc", "value": "asc" }); } TypeScript代码 /** ** 排序方向。 */ type Direct = "asc" | "desc"; /** ** 排序属性。 ** ** @interface IPropertyOrder */ interface IPropertyOrder { [name: string] : Direct; } /** ** 简单名/值对象。 ** ** @interface ISimpleObject */ interface ISimpleObject { [name: string] : string | number | boolean; } /** ** 对简单的名/值对象按照指定属性和排序方向进行排序(根据排序属性及排序方向, ** 对两个项依次进行比较,并返回代表排序位置的值)。 ** ** @template T 简单的名/值对象。 ** @param {T} item1 排序比较项1。 ** @param {T} item2 排序比较项2。 ** @param {...IPropertyOrder[]} props 排序属性。 ** @returns 若项1大于项2返回1,若项1等于项2返回0,否则返回-1。 */ function SortByProps<T extends ISimpleObject> (item1: T, item2: T, ...props: IPropertyOrder[]) { "use strict"; var cps: Array<number> = []; // 存储排序属性比较结果。 // 如果未指定排序属性,则按照全属性升序排序。 var asc = true; if (props.length < 1) { for (var p in item1) { if (item1[p] > item2[p]) { cps.push(1); break; // 大于时跳出循环。 } else if (item1[p] === item2[p]) { cps.push(0); } else { cps.push(-1); break; // 小于时跳出循环。 } } } else { // 按照指定属性及升降方向进行排序。 for (var i = 0; i < props.length; i++) { var prop = props[i]; for (var o in prop) { asc = prop[o] === "asc"; if (item1[o] > item2[o]) { cps.push(asc ? 1 : -1); break; // 大于时跳出循环。 } else if (item1[o] === item2[o]) { cps.push(0); } else { cps.push(asc ? -1 : 1); break; // 小于时跳出循环。 } } } } for (var j = 0; j < cps.length; j++) { if (cps[j] === 1 || cps[j] === -1) { return cps[j]; } } return 0; }

使用场景及局限性

在前端使用JavaScript实现多属性排序,减少了对服务器端的请求,减轻服务器端的计算压力,但是也仅适用于只需要对本地数据进行排序的情形。如果需要对整个数据集进行多属性排序,最终还是要在服务器端的数据库层面上进行。

以上所述是小编给大家介绍的JavaScript对象数组如何按指定属性和排序方向进行排序的全部叙述,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

您可能感兴趣的文章:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wzsxwp.html