如何按自定义模式对字符串数组进行排序
How to sort an array of strings by a custom pattern
我有几个数组像:
var arr1 = ['A', 'B', 'C', 'D'],
arr2 = ['A', 'C', 'D'],
arr3 = ['B', 'D'];
我现在希望它们按照自定义模式排序,例如['D', 'C', 'A', 'B']
。我正在使用lodash并寻找一种智能的方式来做到这一点。
您可以使用对象来有效地将值映射到可排序的值:
var arr1 = [ "A", "B", "C", "D" ];
var map = { D: 1, C: 2, A: 3, B: 4 };
arr1.sort(function(x, y){ return map[x] - map[y]; });
// show result in snippet
document.write(JSON.stringify(arr1));
与Guffa的解决方案的基本思想相同,但使用了可重用的API:
var makeSorter = function(pattern) {
var map = _.mapValues(_.invert(pattern), Number);
return function(vals) {
return vals.sort(function(a, b) {
return map[a] - map[b];
});
};
};
var mySorter = makeSorter(['D', 'C', 'A', 'B']);
mySorter(['A', 'B', 'C', 'D']); //=> ["D", "C", "A", "B"]
mySorter(['A', 'C', 'D']); //=> ["D", "C", "A"]
如果你的数据中可能有一些值不在你的模式中,那么你可能需要一些稍微复杂一点的东西:
var makeSorter = function(pattern) {
var map = _.mapValues(_.invert(pattern), function(s) {return Number(s) + 1;});
return function(vals) {
return vals.sort(function(a, b) {
return (map[a] || Infinity) - (map[b] || Infinity);
});
};
};
mySorter(['A', 'X', 'B', 'C', 'Q']); //=> ["C", "A", "B", "X", "Q"]
还有,ES6的箭头函数是多么的好。这相当于ES6中的第一个版本:
var makeSorter = pattern => {
let map = _.mapValues(_.invert(pattern), Number);
return vals => vals.sort((a, b) => map[a] - map[b]);
};
var pattern = ['D', 'C', 'A', 'B'];
function sortArray (array, pattern) {
return array.sort(function (a, b) {
if (pattern.indexOf(a) === pattern.indexOf(b)) {
return 0;
} else {
return pattern.indexOf(a) > pattern.indexOf(b) ? 1 : -1;
}
});
}
// use like:
var sortedArray = sortArray(['A', 'C', 'D'], pattern);
相关文章:
- JavaScript数组排序(函数)用于对表行进行排序,而不是排序
- Javascript中的多维数组排序索引问题
- 如何按日期对Javascript对象数组排序
- 数组排序后显示更改
- 当许多元素相等时,Javascript数组排序无法正常工作
- Javascript数组排序速度受字符串长度的影响
- 按唯一键将对象数组排序为数组
- 以 js 为单位的数组排序
- js 数组排序无法正常工作
- 数组排序.论点从何而来
- 不需要的数组排序
- 数组排序不正确/不可预测,使用 indexOf 时
- Javascript将数组排序到树中
- 随后的多维数组排序会产生意外的结果
- 数组排序基于纯javascript搜索文本匹配
- Javascript自定义数组按数组排序
- 使用字符串按属性错误对对象进行数组排序
- 多维数组排序
- JavaScript与PHP在数组排序中的对比
- Javascript-关联数组排序