2017-08-16 7 views
0

私は、列配列とデータ配列を持つテーブルコンポーネントを持っています。並べ替えの列とテーブルのテーブルの状態を更新する必要があります。私のメソッドは2つの引数を受け取りますキー(カラムキー)とソート可能(真または偽のカラムはソート可能かどうか)を、どのように混乱させますか?テーブルの列をソートするための最良の解決策は何ですか?それは簡単で、かつソート番号と文字列desc、ascによる並べ替え機能

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 }) 
    } 
+1

言及する価値が多分、[ 'アレイ#sort'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort)は、「真」または「偽」ではなく、ゼロより小さい値、ゼロまたはゼロより大きい値を取得することを期待しています。 –

答えて

3

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]), 
) 
+0

実際には、はい、それは、1つだけをソートするだけで、2番目のクリック(トリガー)はデータを更新していません –

+0

私は良い条件を持っていませんでした、ありがとう、見つけました if(sortable && this.state.order = == 'desc'){ order = 'asc' } –

+0

@PalaniichukDmytroこのように方向を切り替えることができます。 'const order = {asc: 'desc'、desc: 'asc'} [this.state.order]' –

関連する問題