【问题标题】:Sorting function by desc, asc按 desc、asc 排序功能
【发布时间】:2017-08-16 12:16:59
【问题描述】:

我有带有列数组和数据数组的表格组件。我需要对列进行排序并更新表的表状态。我的方法从列接收两个参数 key(列键)和 sortable(可排序的真或假列),我搞砸了什么?排序表列的最佳解决方案是什么?如何让它变得简单,并按数字和字符串排序

const columns = [
    {
        key: 'deviceType',
        label:'Device Type',
        numeric: false,
    }, {
        key: 'deviceID',
        label:'Device ID',
        sortable: true,
        numeric: true,
        // cellRenderer: ({item, key}) =>
        //          <Button >Default</Button>,
    }, {
        key: 'name',
        label: 'Name',
        sortable: false,
        numeric: false,

    },{
        key: 'currentVersion',
        label: 'Current Version',
        sortable: false,
        numeric: false,
    },{
        key: 'location',
        label: 'Location',
        sortable: false,
        numeric: false,
    },{
        key: 'status',
        label: 'Status',
        sortable: false,
        numeric: false,
    },{
        key: 'lastAliveMessage',
        label: 'Last alive message',
        sortable: false,
        numeric: false,
    }, {
        key: 'action',
        label: 'Actions',
        cellRenderer: () => <SimpleMenu />,
    }]

const data = [
    { key: 1, deviceType: 'Tag', deviceID: 1, name:'Tag For sending an ', location: 'Room_104', status: 'assigned'},
    { key: 2, deviceType: 'Tag', deviceID: 2, name:'Tag For sending an ', location: 'Room_104', status: 'assigned'},
    { key: 3, deviceType: 'Tag', deviceID: 3, name:'Tag For sending an ', location: 'Room_104', status: 'assigned'},
    { key: 4, deviceType: 'Tag', deviceID: 4, name:'Tag For sending an ', location: 'Room_104', status: 'assigned'},
    { key: 5, deviceType: 'Tag', deviceID: 5, name:'Tag For sending an ', location: 'Room_104', status: 'assigned'},
]

class EnhancedTable extends Component {
    state = {
        selected: [],
        data,
        order: 'asc',
        search: '',
    }

    handleRequestSort = (key, sortable) => {
        let order = 'desc'

        // if (this.state.order.by === key && this.state.order.direction === 'desc') {
        //     order = 'asc'
        // }
        if (sortable && this.state.order.direction === 'desc') {
            order = 'asc'
        }
        const data = this.state.data.sort(
            (a, b) => {
                order === 'desc' ? b[key] > a[key] : a[key] > b[key]},
        )

        this.setState({ data, order })
    }

【问题讨论】:

  • 也许值得一提,Array#sort 期望得到的不是truefalse,而是一个小于零、零或大于零的值。

标签: javascript reactjs ecmascript-6 material-ui


【解决方案1】:

sort 会就地修改数组。你忘了回来。

const data = this.state.data.slice()
data.sort(
            (a, b) => {
                return order === 'desc' ? b[key] > a[key] : a[key] > b[key]
            },
        )

或者删除{}

 data.sort(
   (a, b) => (order === 'desc' ? b[key] > a[key] : a[key] > b[key]),
 )

【讨论】:

  • 确实,是的,它有效,它只排序一次,第二次点击(触发)不会更新数据
  • 我找到了谢谢,我没有一个好的条件应该是 if (sortable && this.state.order === 'desc') { order = 'asc' }
  • @PalaniichukDmytro 你可以像这样切换方向。 const order = {asc: 'desc', desc: 'asc'}[this.state.order]
猜你喜欢
  • 2014-07-11
  • 1970-01-01
  • 1970-01-01
  • 2015-03-05
  • 2015-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-27
相关资源
最近更新 更多