javascript - 如何有效地映射嵌套对象?
问题描述
我有一个看起来像这样的嵌套对象:
const notes = {
infantry: {
mainHand: {
'3OayPUASk1JJFJwpKW7u': {
id: '3OayPUASk1JJFJwpKW7u',
note: 'Champion blade is overall less powerful ... ',
},
'5N3y7DfjZwFTPxoyg3La': {
id: '5N3y7DfjZwFTPxoyg3La',
note: 'Ghastly Cane has really good stats, ...',
},
'7mOdjVqp9co87Ymkvk9F': {
id: '7mOdjVqp9co87Ymkvk9F',
note: 'Terror Lash is a decent piece, but...',
},
},
offHand: {
G6qQaEqzWcMytMI3W7re: {
id: 'G6qQaEqzWcMytMI3W7re',
note: 'Ranged ATK Jewel',
},
},
},
ranged: {
'7mOdjVqp9co87gmkvk9F': {
id: '7mOdjVqp9co87gmkvk9F',
note: 'Frostwing sword makes a great starter piece for Inf set..',
},
},
};
我使用这样的注释组件(访问步兵道具):
function Notes(props) {
return (
<div>
{Object.values(notes.infantry[props.type]).map((item) => (
<div key={item.id}>
<h5>{item.note}</h5>
</div>
))}
</div>
);
}
我这样称呼组件:
<Notes type={'mainHand'} />
这里的问题是,我不知道如何重用组件来动态更改infantry
为ranged
.
我试图将其更改为:
{Object.values(notes[props.type]).map((item) => (
<div className='p-3 col-sm' key={item.id}>
<h5>{item.note}</h5>
</div>
并通过 <Notes type={'[infantry[mainHand]]'} />
,但它不工作。
我可以解决这个问题的唯一方法是为每个notes
属性(步兵、远程等)制作一个 Notes 组件
解决方案
最好使用表示/容器组件模式并使您的 Notes 组件尽可能简单。将数据检索逻辑提取到某个上游容器。例如:
function Notes({ items }) {
return (
<div>
{items.map(({ id, note }) => (
<div key={id}>
<h5>{note}</h5>
</div>
))}
</div>
);
}
并按如下方式使用它:
<Notes items={Object.values(notes.infantry.mainHand)} />
或者,如果您想将笔记数据封装在Notes
组件内,您可以按如下方式传递选择器函数:
function Notes({ selector }) {
return (
<div>
{selector(notes).map(({ id, note }) => (
<div key={id}>
<h5>{note}</h5>
</div>
))}
</div>
);
}
...
<Notes selector={notes => Object.values(notes.infantry.mainHand)} />
推荐阅读
- node.js - Node 的 bcrypt 比较返回 False 虽然它是真的
- python-3.x - 如何使路径能够在 pytest 之外运行测试
- python - 在 Python 中使用用户代理在 GET 请求中传递什么?
- mqtt - 如何根据 tcpdump 中的主题名称过滤 MQTT 流量
- oracle - 在 Oracle 中的同一存储过程中更新查询
- mysql - MYSQL 数据库修复耗时极长
- haskell - 如何快速在 Int 和 Word 之间进行位转换?
- php - 如何使用原始文件名发送 php 邮件附件
- javascript - 我们可以减少图表条之间的差距吗?
- windows - CF_OPERATION_INFO 结构中的 CF API CF_SYNC_STATUS 字段