如何使array()遵循元素排序规则

时间:2018-10-30 09:09:46

标签: javascript arrays sorting

该数组可以具有不同的大小,但最大可以包含以下元素:

DE/FR/IT/EN/RM

一些可能的数组可能是:

DE/FR/IT/EN/RM,

IT/EN/RM,

DE/RM

如何按照排序规则制作类似的数组?通过表示如何使该数组始终按照以下顺序进行排序: DE/FR/IT/EN/RM

我尝试了类似的方法,但是由于不是js编码器,我从中无法理解任何事情:

function{
.....
....
...
list.sort(compareList());
...
..
.
}

function compareList() {
    var ruleList = new Array();
    ruleList.push("DE","FR","IT","EN","RM");


}

例如

具有3个元素的输入数组:RM,DE,EN

排序后输出:DE,EN,RM

或例如

输入最多包含5个元素:FR,DE,EN,RM,IT

输出:DE,FR,IT,EN,RM

3 个答案:

答案 0 :(得分:4)

您可以为所需顺序获取一个对象,为未知值获取一个默认值,然后按值的增量进行排序。未知项将排序到数组的末尾。

function compareList() {
    var order = { DE: 1, FR: 2, IT: 3, EN: 4, RM: 5, default: Infinity };
    return (a, b) => (order[a] || order.default) - (order[b] || order.default);
}

console.log(['RM', 'DE', 'EN'].sort(compareList()));             // DE EN RM
console.log(['FR', 'DE', 'EN', 'RM', 'IT'].sort(compareList())); // DE FR IT EN RM
.as-console-wrapper { max-height: 100% !important; top: 0; }

为保留第一个元素,您可以为该值赋予一个很大的负值以进行排序。这只能通过事先知道数组来起作用,因为在以后的排序中,没有关于索引的信息。

const
    keepFirst = (array, sort) => {
        var order = array.reduce((r, v, i) => (r[v] = i + 1, r), { default: Infinity });
        order[array[0]] = -Infinity;
        return array.sort((a, b) => (order[a] || order.default) - (order[b] || order.default));
    },
    order = ['DE', 'FR', 'IT', 'EN', 'RM'];

console.log(keepFirst(['RM', 'DE', 'EN'], order).join(' '));             // RM DE EN
console.log(keepFirst(['FR', 'DE', 'EN', 'RM', 'IT'], order).join(' ')); // FR DE IT EN RM

答案 1 :(得分:1)

var base =  ["DE","FR","IT","EN","RM"];
var test = ["DE","IT","FR","EN"];
test.sort((a,b) => base.indexOf(a) - base.indexOf(b));
console.log(test);

您可以使用基本数组的索引作为顺序

var base =  ["DE","FR","IT","EN","RM"];
var test = ["DE","IT","FR","EN"];
test.sort((a,b) => base.indexOf(a) - base.indexOf(b));
console.log(test);

答案 2 :(得分:1)

您可以在下面定义类似sortArrayBy()的函数来实现此目的:

// The sorting function, sorts input array by the by array
function sortArrayBy(input, by) {

  var result = [].concat(input)

  result.sort(( str0, str1 ) => {

     const idx0 = by.indexOf(str0)
     const idx1 = by.indexOf(str1)

     // If str0 or str1 not found in by array, push these
     // to bottom of result
     if(idx0 === -1) return 1
     if(idx1 === -1) return -1

     return idx0 - idx1
  })
  
  return result;
}

var data = ['DE','FR','IT','EN','RM']

console.log('DE/FR/IT/EN/RM', sortArrayBy(data, ['DE','FR','IT','EN','RM']))
console.log('IT/EN/RM', sortArrayBy(data, ['IT','EN','RM']))
console.log('DE/RM', sortArrayBy(data, ['DE','RM']))

sortArrayBy()方法有效地采用了索引数组(即by),该索引数组用于指导返回的input数据(即['DE','FR','IT','EN','RM'])的排序/排序result数组,