Как сортировать данные, которые смешивают текст и число? - PullRequest
0 голосов
/ 27 мая 2019

У меня есть данные, которые будут отображаться в виде таблицы и использовать 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'}]

Если у кого-нибудь есть предложения, помогите.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 27 мая 2019

Вы можете использовать string#localeCompare callback при сортировке массива.Для числовой сортировки массива используйте свойство 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.log(data);
.as-console-wrapper {max-height: 100% !important; top: 0;}
0 голосов
/ 27 мая 2019

Легкий для понимания способ выглядит так:

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;
});
...