[英]Sort an array based on another array's values
我如何排序此数组:
var list = [
'forms/buttons',
'forms/fields',
'layout/common',
'layout/sidebar',
'media/captions',
'media/galleries',
'typography/headings',
];
根据此顺序(斜杠前的部分):
var needed_order = [
'typography',
'forms',
'media',
'layout',
];
预期结果:
// [
// 'typography/headings',
// 'forms/buttons',
// 'forms/fields',
// 'media/captions',
// 'media/galleries',
// 'layout/common',
// 'layout/sidebar',
// ]
这应该有帮助
Array.prototype.sort
以compareFunction
作为参数来确定排序顺序。 阅读更多
如果提供
compareFunction
,则根据比较函数的返回值对所有未定义的数组元素进行排序(所有未定义的元素均排序到数组的末尾,而无需调用compareFunction
)
var list = [ 'forms/buttons', 'forms/fields', 'layout/common', 'layout/sidebar', 'media/captions', 'media/galleries', 'typography/headings', ]; var needed_order = [ 'typography', 'forms', 'media', 'layout', ]; list.sort((a, b) => needed_order.indexOf(a.split('/')[0]) - needed_order.indexOf(b.split('/')[0])); console.log(list);
您可以按“ needed_order”数组中的首次出现进行排序:
const getPriority = el => needed_order.findIndex(order => el.includes(order));
list.sort((a, b) => getPriority(a) - getPriority(b));
您可以按照要排序的项目开头的字符串的索引进行排序。
var list = ['forms/buttons', 'forms/fields', 'layout/common', 'layout/sidebar', 'media/captions', 'media/galleries', 'typography/headings'], order = ['typography', 'forms', 'media', 'layout']; list.sort((a, b) => order.findIndex(v => a.startsWith(v)) - order.findIndex(v => b.startsWith(v))); console.log(list);
对于海量数据,一种更快的版本可能是将键索引值存储在哈希表中并用于排序。
function getS(s) { return s.match(/^[^\\/]*/)[0]; } var list = ['forms/buttons', 'forms/fields', 'layout/common', 'layout/sidebar', 'media/captions', 'media/galleries', 'typography/headings'], order = ['typography', 'forms', 'media', 'layout'], hash = Object.assign(...order.map((k, v) => ({ [k]: v }))); list.sort((a, b) => hash[getS(a)] - hash[getS(b)]); console.log(list);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.