使用 lodash 按特定顺序对数组数组进行排序
sort array of arrays in specific order using lodash
我想根据以下条件对数组数组进行排序:
- 手动给定参数
- 然后按降序排列
这是数组
var ar = [
[{'name' : 'b', 'val' : '1'}, {'name' : 'b', 'val' : '10'}], // 'name' are always the same
[{'name' : 'a', 'val' : '2'}, {'name' : 'a', 'val' : '2'}],
[{'name' : 'c'}, {'name' : 'c', 'val' : '100'}]
]
执行排序功能时:sortBy('a')
应该return我:
var ar = [
[{'name' : 'a', 'val' : '2'}, {'name' : 'a', 'val' : '2'}],
[{'name' : 'c'}, {'name' : 'c', 'val' : '100'}]
[{'name' : 'b', 'val' : '1'}, {'name' : 'b', 'val' : '10'}],
]
因为'a'作为参数给出,所以优先。然后从Z到A排序。
解决方案应该写成ES5(可能的话使用lodash)。
您可以尝试使用与其他不同的顶部排序方式进行降序排列。
const
sortBy = value => ([{ name: a }], [{ name: b }]) =>
(b === value) - (a === value) ||
b.localeCompare(a),
array = [[{ name: 'b', val: '1' }, { name: 'b', val: '10' }], [{ name: 'a', val: '2' }, { name: 'a', val: '2' }], [{ name: 'c'}, { name: 'c', val: '100' }]];
array.sort(sortBy('a'));
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }
ES5
var sortBy = function (value) {
return function (a, b) {
return (b[0].name === value) - (a[0].name === value)
|| b[0].name.localeCompare(a[0].name);
};
},
array = [[{ name: 'b', val: '1' }, { name: 'b', val: '10' }], [{ name: 'a', val: '2' }, { name: 'a', val: '2' }], [{ name: 'c'}, { name: 'c', val: '100' }]];
array.sort(sortBy('a'));
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }
感谢@NirAlfasi 的建议,我找到了一种方法:
function customSort(arr, sortBy, priority){
var sortAZ = function(a,b){return (a[0][sortBy] < b[0][sortBy]) ? -1 : (a[0][sortBy] > b[0][sortBy]) ? 1 : 0;}
var sortPrior = function(a,b){if(b[0][sortBy] === priority ){return 1} else {return 0}}
arr.sort(sortAZ).reverse().sort(sortPrior);
}
customSort(ar,'name','a')
console.log(ar);
我想根据以下条件对数组数组进行排序:
- 手动给定参数
- 然后按降序排列
这是数组
var ar = [
[{'name' : 'b', 'val' : '1'}, {'name' : 'b', 'val' : '10'}], // 'name' are always the same
[{'name' : 'a', 'val' : '2'}, {'name' : 'a', 'val' : '2'}],
[{'name' : 'c'}, {'name' : 'c', 'val' : '100'}]
]
执行排序功能时:sortBy('a')
应该return我:
var ar = [
[{'name' : 'a', 'val' : '2'}, {'name' : 'a', 'val' : '2'}],
[{'name' : 'c'}, {'name' : 'c', 'val' : '100'}]
[{'name' : 'b', 'val' : '1'}, {'name' : 'b', 'val' : '10'}],
]
因为'a'作为参数给出,所以优先。然后从Z到A排序。
解决方案应该写成ES5(可能的话使用lodash)。
您可以尝试使用与其他不同的顶部排序方式进行降序排列。
const
sortBy = value => ([{ name: a }], [{ name: b }]) =>
(b === value) - (a === value) ||
b.localeCompare(a),
array = [[{ name: 'b', val: '1' }, { name: 'b', val: '10' }], [{ name: 'a', val: '2' }, { name: 'a', val: '2' }], [{ name: 'c'}, { name: 'c', val: '100' }]];
array.sort(sortBy('a'));
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }
ES5
var sortBy = function (value) {
return function (a, b) {
return (b[0].name === value) - (a[0].name === value)
|| b[0].name.localeCompare(a[0].name);
};
},
array = [[{ name: 'b', val: '1' }, { name: 'b', val: '10' }], [{ name: 'a', val: '2' }, { name: 'a', val: '2' }], [{ name: 'c'}, { name: 'c', val: '100' }]];
array.sort(sortBy('a'));
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }
感谢@NirAlfasi 的建议,我找到了一种方法:
function customSort(arr, sortBy, priority){
var sortAZ = function(a,b){return (a[0][sortBy] < b[0][sortBy]) ? -1 : (a[0][sortBy] > b[0][sortBy]) ? 1 : 0;}
var sortPrior = function(a,b){if(b[0][sortBy] === priority ){return 1} else {return 0}}
arr.sort(sortAZ).reverse().sort(sortPrior);
}
customSort(ar,'name','a')
console.log(ar);