Javascript 如何按自定义模式对字符串数组进行排序

Javascript 如何按自定义模式对字符串数组进行排序,javascript,arrays,sorting,lodash,Javascript,Arrays,Sorting,Lodash,我有几个数组,如: 我现在希望它们按自定义模式排序,例如['D','C','a','B']。我正在使用并寻找一种智能的方法来实现这一点。您可以使用对象将值有效地映射到可排序的值: var arr1=[“A”、“B”、“C”、“D”]; var-map={D:1,C:2,A:3,B:4}; arr1.sort(函数(x,y){returnmap[x]-map[y];}); //在代码段中显示结果 document.write(JSON.stringify(arr1))与Guffa解决方案的基本思

我有几个数组,如:


我现在希望它们按自定义模式排序,例如
['D','C','a','B']
。我正在使用并寻找一种智能的方法来实现这一点。

您可以使用对象将值有效地映射到可排序的值:

var arr1=[“A”、“B”、“C”、“D”];
var-map={D:1,C:2,A:3,B:4};
arr1.sort(函数(x,y){returnmap[x]-map[y];});
//在代码段中显示结果

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 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"]
var makeSorter = pattern => {
    let map = _.mapValues(_.invert(pattern), Number);
    return vals => vals.sort((a, b) => map[a] - map[b]);
};