繁体   English   中英

如何使排序 function 动态

[英]How to make sort function dynamic

我有一个数组如下:

var arr1 = [{x: 0, y: 0}, {x: 10, y: 10}, {x: 20, y: 20}, {x: 30, y: 30}, {x: 40, y: 40}]

arr1 表示用户创建的信息表中的数据,我使用.sort按 x 的升序对 arr1 进行了排序。

arr1.sort(function(a, b){return a.x - b.x});

当用户将信息表 (arr1) 中值的名称从 x 更改为 z 或创建具有不同名称的新信息表时,我必须修改我的代码以再次对其进行排序。

var arr1 = [{z: 0, y: 0}, {z: 10, y: 10}, {z: 20, y: 20}, {z: 30, y: 30}, {z: 40, y: 40}]

arr1.sort(function(a, b){return a.z - b.z});

因此,我希望我的排序 function 是动态的,以便在更改数组中的值名称或创建具有新名称的信息表时不必更改代码。 我希望我能清楚地回答我的问题,非常感谢任何帮助!

您可以将要排序的键存储在变量中,然后改用该变量。 例子:

var arr1 = [{z: 0, y: 0}, {z: 10, y: 10}, {z: 20, y: 20}, {z: 30, y: 30}, {z: 40, y: 40}]

let keyToSortBy = 'z'
arr1.sort(function(a, b){return a[keyToSortBy] - b[keyToSortBy]});

如果你是 lodash 的粉丝。

import _ from "lodash"
let key = 'z' // dynamic key
_.sortBy(arr1, key);

您需要找到一种方法来动态地告诉您的算法您需要排序的字段是什么。 一个示例是在每个元素中包含一个属性,其中包含要排序的字段的名称。 样本:

var arr1 = [{x: 0, y: 0, sort: 'x'}, {x: 10, y: 10, sort: 'x'}]
var arr1 = [{z: 0, y: 0, sort: 'z'}, {z: 10, y: 10, sort: 'z'}]

然后,您的排序 function 将是相同的:

var sortFunction = function(a, b){return a[a['sort']] - b[b['sort']]}

arr1.sort(sortFunction);
arr2.sort(sortFunction);

制作一个返回 function 的 function:

 var arr1 = [{z: 0, y: 0}, {z: 10, y: 10}, {z: 20, y: 20}, {z: 30, y: 30}, {z: 40, y: 40}] const sortBy = (key) => (a, b) => a[key] - b[key]; arr1.sort(sortBy('z')); console.log(arr1);

如果需要,您可以将数组中的键“编码”为属性(不可迭代):

 var arr1 = [{z: 0, y: 0}, {z: 10, y: 10}, {z: 20, y: 20}, {z: 30, y: 30}, {z: 40, y: 40}]; arr1.sortKey = 'z'; const sortBy = (key) => (a, b) => a[key] - b[key]; arr1.sort(sortBy(arr1.sortKey)); console.log(arr1);

最后,您可以在程序中创建自己的排序 function 到 ALL arrays:

 var arr1 = [{z: 0, y: 0}, {z: 10, y: 10}, {z: 20, y: 20}, {z: 30, y: 30}, {z: 40, y: 40}]; arr1.sortKey = 'z'; Array.prototype.mySort = function() { this.sort((a, b) => a[this.sortKey] - b[this.sortKey]); }; arr1.mySort(); console.log(arr1);

您的示例数据与按任一键排序的值没有太大差异,因为任一排序的结果都相同。

我稍微更改了您的数据以使用 FF console.log 显示差异

排序 function 可以通过调用 function 而不是内联定义的逻辑来压缩。

` 测试页

</style>
</head><body>

<script>
console.clear();

var arr1 = [{z: 0, y: 40}, {z: 10, y: 30}, {z: 20, y: 20}, {z: 30, y: 10}, {z: 40, y: 0}];
console.log('original');
console.log(arr1.toSource());
console.log();

let keyToSortBy = 'z'
arr1.sort(function(a, b){return a[keyToSortBy] - b[keyToSortBy]});
console.log('original sorted by ascending "z"');
console.log(arr1.toSource());
console.log();

keyToSortBy = 'y'
arr1.sort(function(a, b){return a[keyToSortBy] - b[keyToSortBy]});
console.log('original sorted by ascending "y"');
console.log(arr1.toSource());
console.log();

</script>

</body></html>

`

请参见下面的示例。 每次进行更改时,请使用xzSort

 function xzSort(array){ array.sort(function(a, b){ var A = 'x' in a? 'x': 'z'; var B = 'x' in b? 'x': 'z'; return a[A] - b[B]; }); return array; } var a = [{z:40, y:40}, {z:10, y:10}, {z:0, y:0}, {z:20, y:20}, {z:30, y:30}]; console.log(a); console.log(xzSort(a)); a[3] = {x:10, y:15}; console.log(xzSort(a));

您可以将sortByKey添加到 Array 原型:

 Array.prototype.sortByKey = function (key) { return this.sort((a, b) => a[key] - b[key]); }; const arr = [ { x: 1, y: 100 }, { x: 100, y: 5 }, {x: 3, y: 99 }, ]; console.log(arr.sortByKey('x')); console.log(arr.sortByKey('y'));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM