Я использую реагирующую виртуализированную таблицу, и у меня есть некоторые проблемы с сортировкой.
Прежде всего, некоторые столбцы, содержащие числа, нуждаются в числовой сортировке, например, я хочу это [1, 200, 10500, 29000], а не это [1, 10500, 200, 29000]. Как я могу передать числовую сортировку в определенные столбцы?
Еще одна проблема с сортировкой:
Bucharest
Bucharest
Bucuresti
IASI
Oradea
ARAD
BRASOV
BUCHAREST
BUCHAREST
Bucharest
Bucharest
Bucharest
Что тут происходит? Первая и последняя строки «Бухарест» идентичны.
Вот мой код:
import { items } from 'model/component-props';
import _ from 'lodash';
class Items extends React.Component {
constructor(props) {
super(props);
this.state = {
sortBy: 'No',
sortDirection: 'ASC',
}
}
sort = ({sortBy, sortDirection}) => {
console.info({sortBy, sortDirection})
this.setState({
sortBy,
sortDirection,
})
}
render(){
const { items } = this.props;
const simplifiedData = items && _.get(items, ['Soap:Envelope', 'Soap:Body', 'ReadMultiple_Result', 'ReadMultiple_Result', 'ItemList']);
const beautifiedData = _.map(simplifiedData, simple => _.reduce(simple, (r, value, key) => ({
...r,
[key]: value['_text']
}), {}));
const searchKeysList = ['No', 'Description', 'TranslateDescr', 'Inventory', 'Special_Weight', 'Composition', 'Width', 'Unit_Price'];
const filteredData = beautifiedData && beautifiedData.filter(obj =>
_.has(obj, itemSearchKey) && _.includes(obj[itemSearchKey].toLowerCase(), itemSearchTerm.toLowerCase()));
const tempList = _.sortBy([...filteredData], d => d[this.state.sortBy]);
const list = this.state.sortDirection === 'DESC' ? tempList.reverse() : tempList;
return (
<div>
<Table
style = {{paddingTop: '20px'}}
rowStyle = {{border: '0.5px dashed grey'}}
width = {1400}
height = {400}
headerHeight = {35}
rowHeight = {30}
rowCount = {list.length}
rowGetter = {({ index }) => list[index]}
sortBy = {this.state.sortBy}
sortDirection = {this.state.sortDirection}
sort = {this.sort}
onRowClick = {({ rowData }) => this.onItemCardClick(rowData.No)}
>
<Column
label = {content[langProp].ID}
dataKey= 'No'
width = {150}
/>
<Column
style = {{textAlign: 'right'}}
label = {content[langProp].Inventory}
headerStyle = {{textAlign: 'right'}}
cellDataGetter = {({ rowData }) => parseFloat(rowData.Inventory).toFixed(2).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",")}
dataKey='Inventory'
disableSort='true'
width = {200}
/>
<Column
label = {content[langProp].City}
dataKey='City'
width = {200}
/>
</Table>
</div>
);
Любая помощь приветствуется.
@ManavM Спасибо за ваш ответ, я отредактировал свой вопрос.
Я думаю, вы можете создать функцию для проверки типа поля, которое вы хотите отсортировать, и отсортировать его соответственно типу. Возможно, регулярное выражение может помочь определить, является ли это числом или строкой
@Morgana, было бы лучше иметь демо-ссылку на JSFiddle или codeandbox, чтобы любому было легче отлаживать и давать вам решение.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Если вы запустите
var users = [
{ 'age': 315 },
{ 'age': 34 }
];
var result = _.sortBy(users, u => u.age);
Вы обнаружите, что он возвращает {age: 34}, {age: 315}], поэтому вашей числовой проблемы не должно быть... Я предполагаю, что значение на самом деле хранится в виде строки, и в этом случае вы можете запустить регулярное выражение, чтобы проверить, должна ли строка быть число в вашей итерации, подобное этому
var result = _.sortBy(data, d => {
const str = d[this.state.sortBy];
var patt = new RegExp("^\d+$");
if (patt.test(str)) {
return Number.parseInt(str)
}
return str;
}
});
К сожалению, я не уверен, что вызывает проблему с Бухарестом. Мне понадобится образец оригинала и результирующего массива, чтобы увидеть, что происходит. То есть..console.info([...filteredData], tempList);
Спасибо за ваш ответ и ваше время. Хотя regExp не решил проблему числовой сортировки, ваш ответ заставил меня задуматься о другом подходе к этому.
Откуда взялся
_.sortBy()? Вы используете undersccore.js? Если да, то что должен делатьd => d[this.state.sortBy]? Отладить проблему будет проще, если доступна природаfilteredData.