根据另一个数组的值对数组进行排序

时间:2018-07-07 11:41:22

标签: javascript arrays sorting

如何对该数组排序:

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',
// ]

3 个答案:

答案 0 :(得分:5)

这应该有帮助

Array.prototype.sortcompareFunction作为参数来确定排序顺序。 Read more

  

如果提供了compareFunction,则会根据比较函数的返回值对所有未定义的数组元素进行排序(所有未定义的元素都将排序到数组的末尾,而不会调用{{1} })

compareFunction

答案 1 :(得分:0)

您可以按“ needed_order”数组中的第一个外观进行排序:

const getPriority = el => needed_order.findIndex(order => el.includes(order));

list.sort((a, b) => getPriority(a) - getPriority(b));

答案 2 :(得分:0)

您可以按照要排序的项目开头的字符串的索引进行排序。

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);