在 React 和 JSX 中对数组值的单个索引进行排序



我正在尝试对表的行进行排序,并更改给定状态的" sortby"值的每列,但要排序的函数并没有对值进行排序适当地 。该函数当前正在排序,但它对整个数组进行排序,而不是所选排序值我如何修复此函数,以便对单个列进行对整个列,然后将整个数组如下进行

这是我的状态:

state = {
  columnHeaders: ["Meat", "Protein", "Calories", "Carbohydrates", "Fat"],
  rows: [
    ["chicken breast", "25", "200", "37", "8"],
    ["fried chicken", "45", "450", "21", "16"],
    ["baked fish", "15", "250", "30", "9"]
  ],
  sortedBy: "",
  order: "desc",
  query: "all"
};

const { columnHeaders, rows, query, sortedBy, order } = this.state;
const newRows = query === "all" 
  ? rows
  : rows.filter(row => row[0].includes(query));
const sortedRows = sortedBy === ""
  ? newRows
  : newRows.sort((a, b) => {
   const valueA = a[columnHeaders.indexOf(sortedBy)];
   const valueB = b[columnHeaders.indexOf(sortedBy)];
    let sortedValue = 0;
    if (valueA < valueB) {
      sortedValue = -1;
    } else if (valueA > valueB) {
      sortedValue = 1;
    }
    if (order === "desc") {
      // if descending order, turn around the sort order
      sortedValue *= -1;
    }
    return sortedValue;
  });

这是渲染sortedrows变量的地图

{
  sortedRows.map((row, i) => (
    <TableRow key={`thc-${i}`}>
      <TableItem row={row} />
    </TableRow>
  ));
}

您可以使用isNaN检查列是数值列还是字符串列。如果列是一个数字,则只需减去它们即可。否则使用localeComparesort行。

另外,我添加了slice以复制数组,因为sort突变原始数组

const columnHeaders = ["Meat", "Protein", "Calories", "Carbohydrates", "Fat"];
const rows = [
    ["chicken breast", "25", "200", "37", "8"],
    ["fried chicken", "45", "450", "21", "16"],
    ["baked fish", "15", "250", "30", "9"]
  ];
const sortedBy = "Meat", order = "desc";
const newRows = rows.slice().sort((a, b) => {
  const valueA = a[columnHeaders.indexOf(sortedBy)];
  const valueB = b[columnHeaders.indexOf(sortedBy)];
  let sortedValue = 0;
  if (!isNaN(valueA) && !isNaN(valueB))
    sortedValue = valueA - valueB
  else
    sortedValue = valueA.localeCompare(valueB)
  if (order === "desc") {
    sortedValue *= -1;
  }
  return sortedValue;
})
console.log(newRows)

最新更新