javascript - Svelte 迭代对象数组
问题描述
拥有这样的固定对象数组:
export let items = [
{
name: 'package',
subname: 'test'
},
{
name: 'package',
subname: 'test1'
},
{
name: 'pack',
subname: 'test2'
}
]
可以使用每个或其他任何东西进行迭代来获得这样的东西吗?
<div class='item'>
<div class='name'>package</span>
<div class='subname'>test</span>
<div class='subname'>test1</span>
</div>
<div class='item'>
<div class='name'>pack</span>
<div class='subname'>test2</span>
</div>
解决方案
一种解决方案是将项目合并到一个对象中,该对象具有不同name
的键和作为值的所有 s 的数组,subname
就像这样:
{
"package": [
"test",
"test1"
],
"pack": [
"test2"
]
}
您可以在getSubnamesByName
函数中执行此操作:
const getSubnamesByName = (items) => {
const mergedItems = {}
items.forEach(({name, subname}) => {
if (mergedItems[name]) mergedItems[name].push(subname)
else mergedItems[name] = [subname]
})
return mergedItems
}
然后只需将结果存储在mergedItems
安装组件时填充的变量中:
<script>
import { onMount } from 'svelte';
const ITEMS = [ /* ... */ ];
let mergedItems = {}
const getSubnamesByName = (items) => { /* ... */}
onMount(async () => {
mergedItems = getSubnamesByName(ITEMS)
})
</script>
最后使用 2#each
个块迭代此对象的键和值:
{#each Object.keys(mergedItems) as name}
<div class='item'>
<div class='name'>{name}</div>
{#each mergedItems[name] as subname}
<div class='subname'>{subname}</div>
{/each}
</div>
{/each}
看看REPL。
推荐阅读
- html - 如何将 React 应用程序限制在网站上的一条路径上?
- mysql - Redis 和 MySQL 分页策略
- flutter - 如何在颤振中将不透明度添加到我的 Eclipse 容器中,如下所示?
- markdown - 有没有办法验证电报机器人 api 的降价语法?
- c# - 当 PNG 图像转换为 4 位 BMP 图像时,MSPaint 处理什么来消除背景中的对象?
- c++ - 表达式“x = (a,b);”
- node.js - app:compileDebugJavaWithJavac 任务失败,自己的代码出错
- css - 是否存在术语相邻选择器?
- amazon-web-services - AWS S3 Glacier ACL - 对 Glacier 对象的公共读取访问权限
- java - Java 线程 ID 在多个线程池中是否唯一?