Как заставить array () следовать правилу сортировки элементов - PullRequest
0 голосов
/ 30 октября 2018

Массив может иметь различный размер, но максимально может содержать следующие элементы:

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 голосов
/ 30 октября 2018

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);
0 голосов
/ 30 октября 2018

Вы можете определить такую ​​функцию, как 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,

0 голосов
/ 30 октября 2018

Вы можете взять объект для требуемого порядка и значение по умолчанию для неизвестного значения и отсортировать по разнице значений. Неизвестные элементы сортируются в конец массива.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...