#javascript #reactjs
#javascript #reactjs
Вопрос:
У меня есть массив объектов tableData, который необходимо отсортировать по алфавиту.
Это хороший способ для этого?
// ЭТО ТАБЛИЦА ДАННЫХ, В КОТОРОЙ я ИСПОЛЬЗУЮ sort() — это правильный способ?
tableData.sort()
return (
<Table.Row
key={index}
className={tableData.disabled ? 'adjuster-table-disabled-row' : ''}>
<Table.Cell style={{ width: '20%' }}>
{tableData.email || ''}
</Table.Cell>
<Table.Cell style={{ width: '10%' }}>
{tableData.firstName || ''}
</Table.Cell>
<Table.Cell style={{ width: '10%' }}>
{tableData.lastName || ''}
</Table.Cell>
<Table.Cell style={{ width: '7%' }}>
{tableData.dailyAssignments || ''}
</Table.Cell>
<Table.Cell style={{ width: '7%' }}>
{tableData.weeklyAssignments || ''}
</Table.Cell>
<Table.Cell style={{ width: '7%' }}>
{tableData.monthlyAssignments || ''}
</Table.Cell>
<Table.Cell style={{ width: '7%' }}>
{tableData.dailyAverageTime || ''}
</Table.Cell>
<Table.Cell style={{ width: '7%' }}>
{tableData.weeklyAverageTime || ''}
</Table.Cell>
<Table.Cell style={{ width: '7%' }}>
{tableData.monthlyAverageTime || ''}
</Table.Cell>
<Table.Cell style={{ width: '12%', textAlign: 'center' }}>
<a
onClick={() => runtime.navTo(`/analytics/${tableData.userId}`)}
style={tableData.disabled ? disabledLinkStyle : normalLinkStyle}>
Get more statistic
</a>
</Table.Cell>
</Table.Row>
)
Я не могу это проверить, поэтому я не уверен, что это правильно.
Комментарии:
1. Почему вы не можете это протестировать?
Ответ №1:
Это хороший способ для этого?
tableData.sort()
Именно так вы сортируете массив, но:
-
В нынешнем виде это не будет работать корректно, потому что объекты будут сравниваться как строки.
-
Если
tableData
это часть вашего состояния, вы не можете отсортировать его непосредственно на месте, потому что это напрямую изменило бы состояние (sort
сортирует массив на месте, он не создает копию). -
Если отсортированная таблица является частью вашего состояния, вам нужно сделать это в
setState
вызове, а неrender
. Вы не показали, где вы выполняетеsort
вызов, но я подумал, что это важно упомянуть.
Так, например, если вы получаете событие с предложением отсортировать по firstName
:
this.setState(({tableData}) => ({
tableData: tableData.slice().sort((a, b) => a.firstName.localeCompare(b.firstName))
});
Это сработает render
. slice
Создает копию массива перед его сортировкой. sort
Обратный вызов сортирует при firstName
использовании localeCompare
. (Вместо этого вы могли бы использовать Intl.Collator
, если массив содержит большое количество записей.)