React 中的变量更改时关闭和重新打开标签的清洁方式
Clean way of close and reopen tag when variable change in React
我有一个这样的数组:
[
{
group: "A",
id: "1",
name: "Mike"
},
{
group: "A",
id: "6",
name: "Sherley"
},
{
group: "B",
id: "3",
name: "Charlie"
},
{
group: "C",
id: "2",
name: "Dave"
}
]
我想根据数组对数组进行分组。该数组已按组和名称排序。所以,我做了这样的事情:
let lastgroup = c[0].group
return <Group title={lastgroup}>
{c.map(x => {
if (lastgroup == x.group) {
return <a href={"#" + x.id}>{x.name}</a>
} else {
lastgroup = x.group
return </Group><Group title={lastgroup}><a href={"#" + x.id}>{x.name}</a> //-> What should I put here for something like this?
}
})}
</Group>
现在,上面的解决方案显然不起作用,而且不干净。我应该如何关闭和重新打开 Tag?或者有更简洁的方法吗?
谢谢
为了清理实现,我建议使用一个中间过程,通过 Array#reduce()
对子数组进行分组,然后在缩减结果的 Object#entries()
上映射 [=29] =] 带有 <Group />
标签的项目。
reduce 步骤通过 group
键将数据分组到一个对象中。每个分组都包含该组的项目数组(这些项目是分组阶段的 JSX 片段 "created")。
第二步是映射 "reduced object" 的条目。这允许您将 <Group/>
标签包裹在先前减少步骤中为每个组收集的组项目周围,而不需要 lastgroup
想法:
// Component state / data
var data = [
{
group: "A",
id: "1",
name: "Mike"
},
{
group: "A",
id: "6",
name: "Sherley"
},
{
group: "B",
id: "3",
name: "Charlie"
},
{
group: "C",
id: "2",
name: "Dave"
}
]
// Component render method
render() {
return Object.entries(data
.reduce((grouping, item) => {
// Insert items for group if not present
if( !grouping[ item.group ] ) {
grouping[ item.group ] = [];
}
var groupItems = grouping[ item.group ];
// Create each group item, as we build up the items for this group
groupItems.push(<a href={"#" + item.id}>{item.name}</a>);
return grouping;
}, {}))
.map((entry) => {
// entry[0] is the group key, entry[0] is the group value (item array)
const group = entry[0];
const items = entry[1];
// Wrap items of each group with <Group/> tags
return <Group title={group}>{ items }</Group>
})
}
第 1 步,按属性 group
对条目进行分组。
有关详细信息,请参阅
const groups = data.reduce((reducer, current) => {
reducer[current.group] = reducer[current.group] || []
reducer[current.group].push(current)
return reducer
}, {})
/*
console.log(groups)
should give you
{ A:
[ { group: 'A', id: '1', name: 'Mike' },
{ group: 'A', id: '6', name: 'Sherley' }
],
B:
[ { group: 'B', id: '3', name: 'Charlie' } ],
C:
[ { group: 'C', id: '2', name: 'Dave' } ]
}
*/
第 2 步,渲染组
const keys = Object.keys(groups)
return (<div>
{keys.map(key => {
const currentGroup = groups[key]
// now render entries inside each group
return (<Group key={key} title={key}>
{currentGroup.map(entry => {
return <a key={entry.id} href={`#${entry.id}`}>{entry.name}</a>
})}
</Group>)
})}
</div>)
我有一个这样的数组:
[
{
group: "A",
id: "1",
name: "Mike"
},
{
group: "A",
id: "6",
name: "Sherley"
},
{
group: "B",
id: "3",
name: "Charlie"
},
{
group: "C",
id: "2",
name: "Dave"
}
]
我想根据数组对数组进行分组。该数组已按组和名称排序。所以,我做了这样的事情:
let lastgroup = c[0].group
return <Group title={lastgroup}>
{c.map(x => {
if (lastgroup == x.group) {
return <a href={"#" + x.id}>{x.name}</a>
} else {
lastgroup = x.group
return </Group><Group title={lastgroup}><a href={"#" + x.id}>{x.name}</a> //-> What should I put here for something like this?
}
})}
</Group>
现在,上面的解决方案显然不起作用,而且不干净。我应该如何关闭和重新打开 Tag?或者有更简洁的方法吗?
谢谢
为了清理实现,我建议使用一个中间过程,通过 Array#reduce()
对子数组进行分组,然后在缩减结果的 Object#entries()
上映射 [=29] =] 带有 <Group />
标签的项目。
reduce 步骤通过 group
键将数据分组到一个对象中。每个分组都包含该组的项目数组(这些项目是分组阶段的 JSX 片段 "created")。
第二步是映射 "reduced object" 的条目。这允许您将 <Group/>
标签包裹在先前减少步骤中为每个组收集的组项目周围,而不需要 lastgroup
想法:
// Component state / data
var data = [
{
group: "A",
id: "1",
name: "Mike"
},
{
group: "A",
id: "6",
name: "Sherley"
},
{
group: "B",
id: "3",
name: "Charlie"
},
{
group: "C",
id: "2",
name: "Dave"
}
]
// Component render method
render() {
return Object.entries(data
.reduce((grouping, item) => {
// Insert items for group if not present
if( !grouping[ item.group ] ) {
grouping[ item.group ] = [];
}
var groupItems = grouping[ item.group ];
// Create each group item, as we build up the items for this group
groupItems.push(<a href={"#" + item.id}>{item.name}</a>);
return grouping;
}, {}))
.map((entry) => {
// entry[0] is the group key, entry[0] is the group value (item array)
const group = entry[0];
const items = entry[1];
// Wrap items of each group with <Group/> tags
return <Group title={group}>{ items }</Group>
})
}
第 1 步,按属性 group
对条目进行分组。
有关详细信息,请参阅
const groups = data.reduce((reducer, current) => {
reducer[current.group] = reducer[current.group] || []
reducer[current.group].push(current)
return reducer
}, {})
/*
console.log(groups)
should give you
{ A:
[ { group: 'A', id: '1', name: 'Mike' },
{ group: 'A', id: '6', name: 'Sherley' }
],
B:
[ { group: 'B', id: '3', name: 'Charlie' } ],
C:
[ { group: 'C', id: '2', name: 'Dave' } ]
}
*/
第 2 步,渲染组
const keys = Object.keys(groups)
return (<div>
{keys.map(key => {
const currentGroup = groups[key]
// now render entries inside each group
return (<Group key={key} title={key}>
{currentGroup.map(entry => {
return <a key={entry.id} href={`#${entry.id}`}>{entry.name}</a>
})}
</Group>)
})}
</div>)