измените это:
.sort(sortTypes[currentSort].fn.category)
на это:
.sort(sortTypes[currentSort].fn[category])
Я не пробовал, потому что вашему коду требуются дополнительные внешние модули, но это явно ошибка.
Редактировать: Поскольку вы используете sort () в вашем JSX, невозможно было заставить его работать со строками типа «task-one» (sort () сортировал бы его по алфавиту), поэтому мне пришлось перейти на « задание 1". Помните, что вы на самом деле не сортируете по имени, а по имени. Может быть, это возможно сделать с помощью sort (), но я не знаю, как.
Я предлагаю не использовать такие логики c в методе рендеринга, а вместо этого предоставлять уже отсортированные / сгруппированные данные «сверху».
Типы сортировки:
const sortTypes = {
Up: {
fn: {
age: (a, b) => (a.age > b.age ? -1 : a.age > b.age ? 1 : 0),
status: ((a, b) => (a.status > b.status) ? 1 : -1),
name: (a, b) =>{
return (a.name < b.name) ? 1 : -1;
}
}
},
Down: {
fn: {
age: (a, b) => (a.age < b.age ? -1 : a.age > b.age ? 1 : 0),
status: ((a, b) => (a.status < b.status) ? 1 : -1),
name: (a, b) =>{
return (a.name > b.name) ? 1 : -1
}
}
},
};
export default sortTypes;
Компонент:
import React, { Component } from "react";
import "./styles.css";
import sortTypes from "./sortTypes";
import data from "./data";
class BottomPanel extends Component {
state = {
currentSort: "Up",
category: "",
};
onSortChange = category => {
debugger;
const { currentSort } = this.state;
let direction;
if(category !== this.state.category){
direction ='Up'
}else{
direction = currentSort === 'Down' ? 'Up': 'Down';
}
this.setState({
currentSort: direction,
category: category
});
};
render() {
console.log(this.state.category, this.state.currentSort);
const { currentSort, category } = this.state;
return (
data.length >= 0 && (
<div className="bottom-panel">
<div className="table-header row">
<div className="column name">
<span>Name</span>
<button id="btn-cores" onClick={()=>{this.onSortChange('name')}}>
Sort by name
</button>
</div>
<div className="column task-status">
<span>Status</span>
<button id="btn-cores" onClick={()=>{this.onSortChange('status')}}>
Sort by status
</button>
</div>
<div className="column label">
<span>Label</span>
</div>
<div className="column age">
<span>
Age
<button id="btn-age" onClick={()=>{this.onSortChange('age')}}>
Sort by age
</button>
</span>
</div>
<div className="column cluster-ip">
<span>Cluster IP</span>
</div>
<div className="column cpu-usage">
<span>CPU (cores)</span>
{/* <button id="btn-cores" onClick={()=>{this.onSortChange('cores')}}>
Sort by CPU
</button> */}
</div>
<div className="column memory-usage">
<span>Memory (bytes) </span>
{/* <button id="btn-memory" onClick={()=>{this.onSortChange('memory')}}>
Sort by memory
</button> */}
</div>
</div>
<div className="table-body">
{[...data]
.sort(sortTypes[currentSort].fn[category])
.map((task, index) => (
<div className="table-item row" key={index}>
<div className="column name">
<span>{task.name}</span>
</div>
<div className="column task-status">
<span>{task.status}</span>
</div>
<div className="column label">
<span>{task.label}</span>
</div>
<div className="column age">
<span>{task.age} minutes</span>
</div>
<div className="column cluster-ip">
<span>{task.clusterIP}</span>
</div>
<div className="column cpu-usage">
<span className="cpu-usage-chart">
{task.cpuUsage[0].high}
</span>
</div>
<div className="column memory-usage">
<span className="memory-usage-chart">
{task.memoryUsage[0].high}
</span>
</div>
</div>
))}
</div>
</div>
)
);
}
}
export default BottomPanel;
Данные:
const data = [
{
status: "Not available",
label: "task-label",
age: 23,
name: "task-1",
clusterIP: "10.148.0.3",
cpuUsage: [
{
date: "2015-10-1 1:00 PM GMT+1:00",
high: 0.12,
low: 20
},
{
date: "2015-10-1 2:00 PM GMT+1:00",
high: 0.105,
low: 20
},
{
date: "2015-10-1 3:00 PM GMT+1:00",
high: 0.1,
low: 20
}
],
memoryUsage: [
{
date: "2015-10-1 1:00 PM GMT+1:00",
high: 100,
low: 20
},
{
date: "2015-10-1 2:00 PM GMT+1:00",
high: 10,
low: 20
},
{
date: "2015-10-1 3:00 PM GMT+1:00",
high: 50,
low: 20
}
]
},
{
status: "Running",
label: "task-label",
age: 27,
name: "task-2",
clusterIP: "10.148.0.3",
cpuUsage: [
{
date: "2015-10-1 1:00 PM GMT+1:00",
high: 0.06,
low: 20
},
{
date: "2015-10-1 2:00 PM GMT+1:00",
high: 0.105,
low: 20
},
{
date: "2015-10-1 3:00 PM GMT+1:00",
high: 0.1,
low: 20
}
],
memoryUsage: [
{
date: "2015-10-1 1:00 PM GMT+1:00",
high: 570,
low: 20
},
{
date: "2015-10-1 2:00 PM GMT+1:00",
high: 550,
low: 20
},
{
date: "2015-10-1 3:00 PM GMT+1:00",
high: 540,
low: 20
}
]
},
{
status: "Running",
label: "task-label",
age: 21,
name: "task-3",
clusterIP: "10.148.0.3",
cpuUsage: [
{
date: "2015-10-1 1:00 PM GMT+1:00",
high: 0.04,
low: 20
},
{
date: "2015-10-1 2:00 PM GMT+1:00",
high: 0.09,
low: 20
},
{
date: "2015-10-1 3:00 PM GMT+1:00",
high: 0.13,
low: 20
}
],
memoryUsage: [
{
date: "2015-10-1 1:00 PM GMT+1:00",
high: 570,
low: 20
},
{
date: "2015-10-1 2:00 PM GMT+1:00",
high: 400,
low: 20
},
{
date: "2015-10-1 3:00 PM GMT+1:00",
high: 0,
low: 20
}
]
},
{
status: "Running",
label: "task-label",
age: 10,
name: "task-4",
clusterIP: "10.148.0.3",
cpuUsage: [
{
date: "2015-10-1 1:00 PM GMT+1:00",
high: 0.12,
low: 20
},
{
date: "2015-10-1 2:00 PM GMT+1:00",
high: 0.105,
low: 20
},
{
date: "2015-10-1 3:00 PM GMT+1:00",
high: 0.1,
low: 20
}
],
memoryUsage: [
{
date: "2015-10-1 1:00 PM GMT+1:00",
high: 0,
low: 20
},
{
date: "2015-10-1 2:00 PM GMT+1:00",
high: 570,
low: 20
},
{
date: "2015-10-1 3:00 PM GMT+1:00",
high: 0,
low: 20
}
]
},
{
status: "Not available",
label: "task-label",
age: 1440,
name: "task-5",
clusterIP: "10.148.0.3",
cpuUsage: [
{
date: "2015-10-1 1:00 PM GMT+1:00",
high: 0.12,
low: 20
},
{
date: "2015-10-1 2:00 PM GMT+1:00",
high: 0.105,
low: 20
},
{
date: "2015-10-1 3:00 PM GMT+1:00",
high: 0.1,
low: 20
}
],
memoryUsage: [
{
date: "2015-10-1 1:00 PM GMT+1:00",
high: 570,
low: 20
},
{
date: "2015-10-1 2:00 PM GMT+1:00",
high: 100,
low: 20
},
{
date: "2015-10-1 3:00 PM GMT+1:00",
high: 400,
low: 20
}
]
}
];
export default data;
Еще одно замечание: если вы не хотите использовать реактивную таблицу из-за ее предполагаемой сложности, я предлагаю вам хотя бы использовать Loda sh для различных процедуры сортировки / группировки. Делать ваниль JS замечательно, если вы хотите учиться, но если это срочно и практично, Loda sh может сэкономить вам много времени и усилий.