React-виртуализированные проблемы с сортировкой таблиц

Я использую реагирующую виртуализированную таблицу, и у меня есть некоторые проблемы с сортировкой.

Прежде всего, некоторые столбцы, содержащие числа, нуждаются в числовой сортировке, например, я хочу это [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>
);

Любая помощь приветствуется.

Откуда взялся _.sortBy()? Вы используете undersccore.js? Если да, то что должен делать d => d[this.state.sortBy]? Отладить проблему будет проще, если доступна природа filteredData.

ManavM 06.02.2019 10:53

@ManavM Спасибо за ваш ответ, я отредактировал свой вопрос.

Morgana 06.02.2019 11:01

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

duc mai 06.02.2019 11:02

@Morgana, было бы лучше иметь демо-ссылку на JSFiddle или codeandbox, чтобы любому было легче отлаживать и давать вам решение.

SESN 06.02.2019 11:18
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
484
1

Ответы 1

Если вы запустите

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

ManavM 06.02.2019 11:38

Спасибо за ваш ответ и ваше время. Хотя regExp не решил проблему числовой сортировки, ваш ответ заставил меня задуматься о другом подходе к этому.

Morgana 06.02.2019 11:59

Другие вопросы по теме