reactjs - 做出反应。在另一个地图中运行 .map 或 .filter
问题描述
您如何在另一个地图中运行地图或过滤器?我有一些带有菜单的 Json。如果我的第一级有任何孩子,我想循环真实的 Json 和 se。如果他们有孩子,则返回引导下拉菜单,如果没有则返回普通按钮。如果有的话,然后循环所有孩子。. . . . . . . . . . . . . . . .
import React from 'react';
// MockData
var MockData = [
{
"text": "Chocolate Beverage",
"id": "1",
"parentid": "-1"
}, {
"id": "2",
"parentid": "1",
"text": "Hot Chocolate"
}, {
"id": "3",
"parentid": "1",
"text": "Peppermint Hot Chocolate"
}, {
"id": "4",
"parentid": "1",
"text": "Salted Caramel Hot Chocolate"
}, {
"id": "5",
"parentid": "1",
"text": "White Hot Chocolate"
}, {
"id": "6",
"text": "Espresso Beverage",
"parentid": "-1"
}, {
"id": "7",
"parentid": "6",
"text": "Caffe Americano"
}, {
"id": "8",
"text": "Caffe Latte",
"parentid": "6"
}, {
"id": "9",
"text": "Caffe Mocha",
"parentid": "6"
}, {
"id": "10",
"text": "Cappuccino",
"parentid": "6"
}, {
"id": "11",
"text": "Pumpkin Spice Latte",
"parentid": "6"
}, {
"id": "12",
"text": "Frappuccino",
"parentid": "-1"
}, {
"id": "13",
"text": "Caffe Vanilla Frappuccino",
"parentid": "12"
}, {
"id": "15",
"text": "450 calories",
"parentid": "13"
}, {
"id": "16",
"text": "16g fat",
"parentid": "13"
}, {
"id": "17",
"text": "13g protein",
"parentid": "13"
}, {
"id": "14",
"text": "Caffe Vanilla Frappuccino Light",
"parentid": "12"
}]
export default class Test2 extends React.PureComponent {
constructor(props) {
super(props);
this.state = {
showSubMenu: []
};
}
render() {
var children = {};
for (let obj of MockData) {
if (!children.hasOwnProperty(obj.parentid)) {
children[obj.parentid] = [obj.id];
}
else {
children[obj.parentid].push(obj.id);
}
}
const map_func = (firstLevel, index) => {
if (children.hasOwnProperty(firstLevel.id)) {
return <p><b>Dropdown / {firstLevel.text} / {firstLevel.parentid}</b></p>;
} else {
return <p>Button / {firstLevel.text} / {firstLevel.parentid}</p>;
}
};
return (
<div>
{MockData.map(map_func)}
</div>
);
}
}
解决方案
你应该建立一个像这样的地图:
var children = {};
for (let obj of MockData) {
if (!children.hasOwnProperty(obj.parentid)) {
children[obj.parentid] = [obj.id];
}
else {
children[obj.parentid].push(obj.id);
}
}
现在您可以通过这种方式轻松检查您firstLevel
是否至少有一个孩子:
if (children.hasOwnProperty(firstLevel.id)) {
// bootstrap dropdown
} else {
// normal button
}
children[firstLevel.id]
如果有的话,孩子的身份证在里面
编辑:所以你的最终代码应该是这样的:
render() {
const map_func = (firstLevel, index) => {
if (children.hasOwnProperty(firstLevel.id)) {
// return bootstrap dropdown;
} else {
// return normal button;
}
};
return (
<div>
{MockData.map(map_func)}
</div>
);
}
推荐阅读
- python - 如何在不离开僵尸进程的情况下从 Python Web 服务器双重分叉?
- sql - 在 postgresql 中序列增量为 2018AA00001
- ios - 将unity 2018项目嵌入Xcode9.4.1
- bash - 如何使用 while 读取文件名;采取文件名剥离“(-到最后”,然后创建一个包含该信息的目录?
- ansible - Ansible 抱怨“需要 MySQL-python 模块”
- rally - Rally API 日期过滤器不起作用
- python - Evernote 访问令牌 Python
- cuda - nvlink 可以从单独的编译单元中内联设备功能吗?
- node.js - 切换到 Docker 后 Node 的缓存问题?
- html - 将文本元素的宽度继承给换行 HTML