Естественная сортировка массива массивов - PullRequest
0 голосов
/ 03 мая 2018

Мне нужно отсортировать массив массивов, данных мне. Массив выглядит примерно так.

var provided_array = [
    inner_array_one = ['1', '10', '11', 'Alpha', '2A'],
    inner_array_two = ['Hotdogs', 'Pies', 'Burgers', 'Kebabs', 'Tacos']
    ];

Я сохранил этот пример как можно меньше. В действительности обычно существует около дюжины таких внутренних массивов.

Данные в inner_array_one связаны с данными из inner_array_two по индексу. То есть «2A» относится к «Тако».

Сортировка должна быть "естественной", то есть 2 до 10. Общий ожидаемый результат мне нужен

provided_array[
    inner_array_one['1', '2A', '10', '11', 'Alpha'],
    inner_array_two['Hotdogs', 'Tacos', 'Pies', 'Burgers', 'Kebabs']
    ];

Я пытался использовать функцию сортировки javascript, но кажется, что она способна сортировать только порядок inner_arrays, а не содержимое этих упомянутых массивов.

То, что я хочу, достижимо?

Ответы [ 3 ]

0 голосов
/ 03 мая 2018

Эта простая функция будет сортировать массив массивов на любом уровне вложенности:

function sortArray(arr) {
    if (!Array.isArray(arr) || !arr.length) return;
    if (Array.isArray(arr[0]))
        arr.forEach(ele => sortArray(ele));
    arr = arr.sort();
}
0 голосов
/ 03 мая 2018

Вы можете использовать kn параметр .localeCompare() для естественной сортировки буквенно-цифровых строк.

var provided_array = [
    inner_array_one = ['1', '10', '11', 'Alpha', '2A'],
    inner_array_two = ['Hotdogs', 'Pies', 'Burgers', 'Kebabs', 'Tacos']
    ];


provided_array.forEach(item => item.sort((obj1, obj2) => obj1.localeCompare(obj2, 'en-US-u-kn-true')));


console.log(provided_array);

DEMO FIDDLE

0 голосов
/ 03 мая 2018

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

var arrays = [
        ['1', '10', '11', 'Alpha', '2A'],
        ['Hotdogs', 'Pies', 'Burgers', 'Kebabs', 'Tacos']
    ],
    indices = Object.keys(arrays[0]);
    
indices.sort((a, b) => arrays[0][a].localeCompare(arrays[0][b], undefined, { numeric: true, sensitivity: 'base' }));

console.log(arrays.map(a => indices.map(i => a[i])));
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...