У меня есть данные, которые будут отображаться в виде таблицы и использовать orderBy (lodash) для сортировки данных, но они не работают так, как я хочу.
Теперь я кодирую как
const data = orderBy(realData, ['name'], ['asc'])
Вот мои данные
Вход:
[{name: 'A1'},{name:'A2'},{name: 'A21'},{name:'B10'},{name: 'A100'},{name:'A22'},{name: 'B32'},{name:'A3'}]
Проблема заключается в сортировке данных 'orderBy' в виде текста (сортировка ASCII)
текущий выход:
[{name: 'A1'},{name: 'A100'},{name:'A2'},{name: 'A21'},{name:'A22'},{name:'A3'},{name:'B10'},{name: 'B32'}]
но я хотел бы, чтобы вывод данных был таким
[{name: 'A1'},{name:'A2'},{name:'A3'},{name: 'A21'},{name:'A22'},{name: 'A100'},{name:'B10'},{name: 'B32'}]
Если у кого-то есть какие-либо предложения, пожалуйста, помогите.
Спасибо.
Возможный дубликат Javascript: естественный вид буквенно-цифровых строк
Вы можете использовать обратный вызов string#localeCompare
при сортировке массива. Для численной сортировки массива используйте свойство numeric
.
let data = [{name: 'A1'},{name: 'A100'},{name:'A2'},{name: 'A21'},{name:'A22'},{name:'A3'},{name:'B10'},{name: 'B32'}];
data.sort((a,b) => a.name.localeCompare(b.name, undefined, {numeric: true}));
console.info(data);
.as-console-wrapper {max-height: 100% !important; top: 0;}
Простой для понимания способ выглядит следующим образом:
data.sort((a, b) => {
const listA = a.name.trim().split('');
const listB = b.name.trim().split('');
const categoryA = listA.splice(0, 1);
const categoryB = listB.splice(0, 1);
const numberA = listA.join('');
const numberB = listB.join('');
if (categoryA > categoryB) return 1;
if (categoryA < categoryB) return -1;
return numberA - numberB;
});
Вы можете проверить: stackoverflow.com/questions/2802341/…