javascript - 按字母顺序呈现名称列表并按其第一个字符分组
问题描述
我需要按字母顺序呈现名称列表,并按每个名称的起始字母分组。它应该如下所示:
**A**
Anders
Anton
Angela
**B**
Brian
Bernard
**C**
Carl
我当前的解决方案可以对对象中包含的所有名称进行排序,但我无法在名称之前添加起始字母作为元素(例如,在“Anders”上方呈现“A”,在“Brian”上方呈现“B”)
当前解决方案:
completeEmpList = empList
.sort((a, b) => a.Name.localeCompare(b.Name))
.map((emp) => (
<div> {emp.Name} </div>
))
它不应该处理最多超过 300 个元素的数据,因此在这种情况下优化并不那么重要。
解决方案
您可以先排序,然后使用reduce
创建一个对象并按每个名称的第一个字符对值进行分组。
var data = [
{ Name: 'Carl' },
{ Name: 'Anders' },
{ Name: 'Anton' },
{ Name: 'Brian' },
{ Name: 'Bernard' },
{ Name: 'Angelaa' },
];
const App = ({ data }) => {
const parsedData = React.useMemo(() => {
const obj = data.reduce((r, { Name }) => {
const l = Name[0];
if (!r[l]) r[l] = [Name];
else r[l].push(Name);
return r;
}, {});
const sorted = Object.entries(obj).sort(([a], [b]) => a.localeCompare(b));
return sorted;
}, [data]);
return parsedData.map(([key, value]) => (
<div key={key}>
<strong>{key}</strong>
<ul>
{value.map(v => (
<li key={v}>{v}</li>
))}
</ul>
</div>
));
};
ReactDOM.render(<App data={data} />, document.querySelector('#root'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/17.0.2/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/17.0.2/umd/react-dom.production.min.js"></script>
<div id="root"></div>
推荐阅读
- php - Yii1如何重新连接默认数据库?
- python - Python中时间序列数据的散点可视化
- arrays - Crystal Reports 选择公式 Crystal 语法 - 值不在字段中或值在数组中
- gradle - 为什么 clean.doLast 不起作用但 clean.doFirst 在 gradle 中运行良好?
- regex - 包含多行文本的特定模式的正则表达式
- colors - 如何为 vuetify 表格行添加颜色
- google-people-api - Google People API - 永久删除垃圾箱中的联系人
- python - 由 PYINSTALLER 在 WINDOWS 上创建的 .exe 文件可以在任何其他操作系统上运行吗?
- swift - 使用 `titlebarAppearsTransparent=true` 时启用“双击缩放”
- json - 如何在 ARM 模板中添加小磁盘功能