javascript - 以非完整顺序对字符串数组进行排序(确保元素 X 是第一个,但对其他所有内容执行任何操作)
问题描述
在flask-react-app-tutorial之后,我试图将数据从我的简单server.py推送到App.js中,并将其显示在一个漂亮的表格中。
我使用了material-ui 表格中最简单的表格布局,并尽可能多地对其进行了调整,使其成为动态的,并且数据将仅由服务器控制,这意味着我可以添加/删除条目(行)或条目参数(列)就在服务器中。
我的问题"TODO"
在代码中的注释中有描述,但我会在这里重写:
- 如何从服务器获取条目参数,并对它们进行排序,但不完全。例如,参数是 ABC,我希望 A 始终是第一个,C 始终是最后一个(在这种情况下,它强制执行A、B、C的排序,因此即使服务器稍后更改了参数并将 D 添加到一堆,顺序将是A,[B,D],C(我不关心[]中参数的顺序,只要它一致)?
- 我认为这应该/必须在反应应用程序中发生,但是是否可以在 Python 服务器中预先对其进行排序?目前我正在返回一个无法排序的字典,但是 OrderedDict 是否合法(即有效且是一个好主意)?
应用程序.js
import React, { useState, useEffect } from 'react';
import Paper from '@material-ui/core/Paper';
import Table from '@material-ui/core/Table';
import TableCell from '@material-ui/core/TableCell';
import TableContainer from '@material-ui/core/TableContainer';
import TableHead from '@material-ui/core/TableHead';
import TableRow from '@material-ui/core/TableRow';
export default function SimpleTableDisplayingServerData() {
const [ data, SetData ] = useState(0);
// TODO: (0) How can I make sure the data from useEffect is sorted? (at least have the "Name" column as the 1st column)
// TODO: (0.0) How can I get the headers (like I did in the <TableHead>) as a const?
// TODO: (0.1) How can I create a non-strict ordering in an array of strings? (i.e. make sure "A" is first, "D" is last, but all others can be wherever)
// TODO: (0.2) Given that ordering, how can I order all my keys / values mappings (in the <TableRow>) accordingly?
useEffect(() => {
fetch('/bla').then(result => result.json()).then(d => {
SetData(d)
})
}, [])
return (
<TableContainer component={Paper}>
<Table size="small" aria-label='simple table'>
<TableHead> <TableRow> { Object.keys(data).map(k => <TableCell align='left'>{k}</TableCell> )} </TableRow> </TableHead>
<TableRow> { Object.values(data).map(v => <TableCell align='left'>{v}</TableCell> )} </TableRow>
</Table>
</TableContainer>
);
}
服务器.py
#!/usr/bin/env python
from flask import Flask
from random import randint, random
app = Flask(__name__)
def create_entry():
name = 'bla' + str(randint(0,20))
cal = random()
fat = random()
carb = random()
prot = random()
return {
"Name": name,
"Calories": cal,
"Fat": fat,
"Carbs": carb,
"Protein": prot,
}
@app.route('/bla')
def bla():
return create_entry()
解决方案
您可以为所需的项目顺序获取一个对象,并仅使用最左边和最右边的值。对于所有其他(未知)值取零。
const
order = { a: -Number.MAX_VALUE, c: Number.MAX_VALUE },
values = ['b', 'c', 'a', 'd'];
values.sort((a, b) => (order[a] || 0) - (order[b] || 0));
console.log(...values);
推荐阅读
- gradle - 使用插件“java-gradle-plugin”时找不到插件错误的实现类
- macos - 列选择模式触发 Intellij 上的谷歌搜索
- dialogflow-es - 自己的 Google 助手:Dialogflow 模拟到 action sdks action.json
- ios - 导航回视图时更新 SwiftUI 选择器最小值和最大值
- javascript - D3 折线图 - 当 sidenav 打开或关闭时重新渲染轴(x 和 y)
- javascript - 按字符串拆分仅适用于第一个子字符串
- php - 循环返回一些奇怪的点
- kubernetes - GKE 在 2 个后端应用程序之间的集群负载平衡
- ios - 如何将百分比值精确四舍五入到小数点后两位?
- javascript - 纯 JavaScript async/await 在 while 循环中等待每个 XMLHttpRequest 完成,然后再发送下一个 XMLHttpRequest