我有这个数组

const rows = [
    {data: [{text: "A",value: 100}, {text: "B",value: 74}], group: "Elephant"},
    {data: [{text: "C",value: 63}, {text: "D",value: 1}], group: "Elephant"},
    {data: [{text: "E",value: 37}, {text: "F",value: 54}], group: "Penguin"},
    {data: [{text: "G", value: 72}, {text: "H", value: 74}], group: "Lion"},
    {data: [{text: "K", value: 76}, {text: "L", value: 38}], group: "Zebra"},
    {data: [{text: "M", value: 68}, {text: "N", value: 21}], group: "Lion"},
];

这些排序函数

const _sortFunction = (
    a,
    b,
    columnIndex,
    sortOrder
) => {
    if (a && a.data && b && b.data) {
        if (a.data[columnIndex].value === b.data[columnIndex].value) {
            return 0;
        } else {
            if (sortOrder === "ASC") return a.data[columnIndex].value > b.data[columnIndex].value ? -1 : 1;
            if (sortOrder === "DESC") return a.data[columnIndex].value < b.data[columnIndex].value ? -1 : 1;
            return 0;
        }
    } else {
        return 0;
    }
};

const sortRowsByColumn = (rows, sortProps) => {
    if (sortProps && rows) {
        const {indexOfColumnToSort, sortOrder} = sortProps;
        const rowsCopy = JSON.parse(JSON.stringify(rows))
        return rowsCopy.sort((a, b) => _sortFunction(a, b, indexOfColumnToSort, sortOrder));
    }
    return rows;
};

这给了我console.log(sortRowsByColumn(rows, {indexOfColumnToSort: 1, sortOrder: "ASC"}))

[
{data: [{text: "A", value: 100}, {text: "B", value: 74}], group: "Elephant"}, 
{data: [{text: "G", value: 72}, {text: "H", value: 74}], group: "Lion"}, 
{data: [{text: "E", value: 37}, {text: "F", value: 54}], group: "Penguin"}, 
{data: [{ text: "K", value: 76}, {text: "L", value: 38}], group: "Zebra"}, 
{data: [{text: "M", value: 68}, {text: "N", value: 21}], group: "Lion"}, 
{data: [{text: "C", value: 63}, {text: "D", value: 1}],group: "Elephant"}
]

然而,我想不通的是: 更新后的sortRowsByColumn()函数应该

  1. 根据group键对rows数组进行排序(按字母顺序)
  2. 然后根据每个组的列索引进行排序

所有这一切都不会丢失原始的数组 struct .基本上类似于对每个组进行分组和排序,而不修改数组 struct 或原始array. 结果应该如下所示

[
{data: [{text: "A",value: 100}, {text: "B", value: 74}], group: "Elephant"}, 
{data: [{text: "C", value: 63}, {text: "D", value: 1}], group: "Elephant"}, 
{data: [{text: "G", value: 72}, {text: "H", value: 74}], group: "Lion"}, 
{data: [{text: "M", value: 68}, {text: "N", value: 21}], group: "Lion"},
{data: [{text: "E",value: 37}, {text: "F", value: 54}], group: "Penguin"}, 
{data: [{text: "K", value: 76}, {text: "L", value: 38}], group: "Zebra"}, 
]

推荐答案

我在下面添加了示例代码.

const _sortFunction = (
  a,
  b,
  columnIndex,
  sortOrder
) => {
  if (a && a.data && b && b.data) {
    if (a.data[columnIndex].value === b.data[columnIndex].value) {
      return 0;
    } else {
      if (sortOrder === "ASC") return a.data[columnIndex].value > b.data[columnIndex].value ? -1 : 1;
      if (sortOrder === "DESC") return a.data[columnIndex].value < b.data[columnIndex].value ? -1 : 1;
      return 0;
    }
  } else {
    return 0;
  }
};


const sortRowsByColumn = (rows, sortProps) => {
  if (!sortProps || !rows) {
    return rows;
  }

  const {
    indexOfColumnToSort,
    sortOrder
  } = sortProps;

  const groupedAndSortedRows = [...rows].sort((a, b) =>
    a.group.localeCompare(b.group) || _sortFunction(a, b, indexOfColumnToSort, sortOrder)
  );

  groupedAndSortedRows.forEach(row =>
    row.data.sort((a, b) => _sortFunction(a, b, indexOfColumnToSort, sortOrder))
  );

  return groupedAndSortedRows;
};




// Example usage
const rows = [
    {data: [{text: "A",value: 100}, {text: "B",value: 74}], group: "Elephant"},
    {data: [{text: "C",value: 63}, {text: "D",value: 1}], group: "Elephant"},
    {data: [{text: "E",value: 37}, {text: "F",value: 54}], group: "Penguin"},
    {data: [{text: "G", value: 72}, {text: "H", value: 74}], group: "Lion"},
    {data: [{text: "K", value: 76}, {text: "L", value: 38}], group: "Zebra"},
    {data: [{text: "M", value: 68}, {text: "N", value: 21}], group: "Lion"},
];
console.log(sortRowsByColumn(rows, {
  indexOfColumnToSort: 1,
  sortOrder: "ASC"
}));

  • 我首先根据"group"键对行数组进行排序,按字母顺序使用localeCompare进行排序.

  • 然后,我映射已排序的行,并使用现有的_sortFunction基于指定的列索引对每个组中的数据数组进行排序.

Javascript相关问答推荐

foreach循环中的Typescript字符串索引

禁用从vue.js 2中的循环创建的表的最后td的按钮

React Native平面列表自动滚动

ReactJS中的material UI自动完成类别

togglePopover()不打开但不关闭原生HTML popover'

微软Edge编辑和重新发送未显示""

如何在不创建新键的情况下动态更改 map 中的项目?

我的角模板订阅后不刷新'

Ember.js 5.4更新会话存储时如何更新组件变量

S文本内容和值不必要的不同

为什么我的getAsFile()方法返回空?

用于在路径之间移动图像的查询

如何限制显示在分页中的可见页面的数量

使用Document.Evaluate() Select 一个包含撇号的HTML元素

每次重新呈现时调用useState initialValue函数

将相关数据组合到两个不同的数组中

如何根据查询结果重新排列日期

MUI迷你图:如何将$符号添加到MUI迷你图中的工具提示数据

react :图表负片区域不同 colored颜色

如何从嵌套的json中获取最大值