如何在 React 中使用 JSX 映射多个对象数组?
How can I map through several arrays of objects using JSX in React?
我有一些json数据:
{
"shops" :
[
{
"type" : "Blacksmith/Armoury",
"items_light_armour" :
[
"Light Armour",
{
"id": 1,
"item" : "Padded Armour",
"low_price": 15,
"med_price": 20,
"high_price": 30,
"available": true,
"limited": false,
"weight": 8,
"blurb": "AC11. Made of quilted layers of cloth and batting."
},
//...
//three other objects, as array elements, with a similar set of key/value pairs
第一个元素(在 items_light_armour 数组内)只是一个字符串,用于表示每个数据集的类别。
我想做的是在我拥有的 table 中显示每个对象(除了它的 ID 和简介)。 table 为映射的每个项目生成新行。
我遇到的问题是它没有按预期映射数据。
这是 table 首次加载时的样子的图片:
所以数据确实映射到 table,但只是每个对象数组中的第一项。老实说,我不确定如何获取每个类别的所有数据。
具体来说,每个类别都应该列出它的所有项目,然后会打开一个新类别,像第一个一样列出它的所有条目,依此类推,直到到达数组的末尾,而不是像上面显示的那样从每个条目中列出一个。
以下是我从 JSON 文件(在组件中的 return 块上方)获取数据的方法:
//get the json data
const jsonData = require("../Reference Files/Json Files/shops.json");
然后,我将其转换为 const
const objInnerValues = Object.values(jsonData.shops[0])
然后,在我的组件的 return 块中,我是这样 'fill' table 行的。
编辑:这是最新的代码,遵循@John 的建议:
//...
{
<>
objInnerValues.map((things, outerIndex) => (
{outerIndex === 0 ? console.log("outerIndex WAS 0"):
<TableRow key= {outerIndex} onClick={() => BarkItemBlurb(outerIndex)}>
{Object.values(things).map((eachThing, innerIndex) => (
{innerIndex == 0 ? console.log("innerIndex or outerIndex was 0"):
<>
<SuperTD key={innerIndex}>{eachThing.item}</SuperTD>
<SuperTD key={innerIndex+1}>{eachThing.weight}lbs</SuperTD>
<SuperTD key={innerIndex+2}>{eachThing.low_price}gp</SuperTD>
<SuperTD key={innerIndex+3}>{eachThing.med_price}gp</SuperTD>
<SuperTD key={innerIndex+4}>{eachThing.high_price}gp</SuperTD>
</>
})
</TableRow>
})
</>
}
//...
我正在使用样式组件,因此使用了奇怪的 html 标签名称。
如有任何建议,我们将不胜感激。
这大概就是你想要的。当你得到东西时,你会映射它,你不需要索引它,因为每个东西都是实际的对象。
{
objInnerValues.map((things, i) => (
{things.map((eachThing) => (
<TableRow key= {i} onClick={() => BarkItemBlurb(i)}>
<SuperTD>{eachThing.item}</SuperTD>
<SuperTD>{eachThing.weight}lbs</SuperTD>
<SuperTD>{eachThing.low_price}gp</SuperTD>
<SuperTD>{eachThing.med_price}gp</SuperTD>
<SuperTD>{eachThing.high_price}gp</SuperTD>
</TableRow>
)}
))}
由于缺少工作代码,我没有运行;我可能有错误的 brackets/closing 个括号,也可能放在错误的位置,但总的来说它应该会指导您找到解决方案。
感谢@John 的协助。
我的设计过于复杂了。我的 JSON 文件包含数组和对象,导致导航不便。
将其重组为仅包含数组后,就容易多了。
此外,至于实际问题,有人告诉我我需要在原来的地图函数中添加另一个地图函数,以使其以正确的方式吐出数据。
//...
Object.values(thing).map((innerThing, innerIndex) => (
<>
{console.log("\nouter/inner: "+outerIndex +", " +innerIndex)}
{console.log("\nData: \n\t"+innerThing[2] +"\n\t" +innerThing[8] + "\n\t" +innerThing[3]+"\n\t" + innerThing[4]+"\n\t"+innerThing[5])}
<TableRow key = {thing[0].toString()}>
<SuperTD>{innerThing[2]}</SuperTD>
<SuperTD>{innerThing[8]}lbs</SuperTD>
<SuperTD>{innerThing[3]}gp</SuperTD>
<SuperTD>{innerThing[4]}gp</SuperTD>
<SuperTD>{innerThing[5]}gp</SuperTD>
</TableRow>
</>
//...
现在,映射排序后,结果如下:
我有一些json数据:
{
"shops" :
[
{
"type" : "Blacksmith/Armoury",
"items_light_armour" :
[
"Light Armour",
{
"id": 1,
"item" : "Padded Armour",
"low_price": 15,
"med_price": 20,
"high_price": 30,
"available": true,
"limited": false,
"weight": 8,
"blurb": "AC11. Made of quilted layers of cloth and batting."
},
//...
//three other objects, as array elements, with a similar set of key/value pairs
第一个元素(在 items_light_armour 数组内)只是一个字符串,用于表示每个数据集的类别。
我想做的是在我拥有的 table 中显示每个对象(除了它的 ID 和简介)。 table 为映射的每个项目生成新行。 我遇到的问题是它没有按预期映射数据。
这是 table 首次加载时的样子的图片:
所以数据确实映射到 table,但只是每个对象数组中的第一项。老实说,我不确定如何获取每个类别的所有数据。 具体来说,每个类别都应该列出它的所有项目,然后会打开一个新类别,像第一个一样列出它的所有条目,依此类推,直到到达数组的末尾,而不是像上面显示的那样从每个条目中列出一个。
以下是我从 JSON 文件(在组件中的 return 块上方)获取数据的方法:
//get the json data
const jsonData = require("../Reference Files/Json Files/shops.json");
然后,我将其转换为 const
const objInnerValues = Object.values(jsonData.shops[0])
然后,在我的组件的 return 块中,我是这样 'fill' table 行的。 编辑:这是最新的代码,遵循@John 的建议:
//...
{
<>
objInnerValues.map((things, outerIndex) => (
{outerIndex === 0 ? console.log("outerIndex WAS 0"):
<TableRow key= {outerIndex} onClick={() => BarkItemBlurb(outerIndex)}>
{Object.values(things).map((eachThing, innerIndex) => (
{innerIndex == 0 ? console.log("innerIndex or outerIndex was 0"):
<>
<SuperTD key={innerIndex}>{eachThing.item}</SuperTD>
<SuperTD key={innerIndex+1}>{eachThing.weight}lbs</SuperTD>
<SuperTD key={innerIndex+2}>{eachThing.low_price}gp</SuperTD>
<SuperTD key={innerIndex+3}>{eachThing.med_price}gp</SuperTD>
<SuperTD key={innerIndex+4}>{eachThing.high_price}gp</SuperTD>
</>
})
</TableRow>
})
</>
}
//...
我正在使用样式组件,因此使用了奇怪的 html 标签名称。
如有任何建议,我们将不胜感激。
这大概就是你想要的。当你得到东西时,你会映射它,你不需要索引它,因为每个东西都是实际的对象。
{
objInnerValues.map((things, i) => (
{things.map((eachThing) => (
<TableRow key= {i} onClick={() => BarkItemBlurb(i)}>
<SuperTD>{eachThing.item}</SuperTD>
<SuperTD>{eachThing.weight}lbs</SuperTD>
<SuperTD>{eachThing.low_price}gp</SuperTD>
<SuperTD>{eachThing.med_price}gp</SuperTD>
<SuperTD>{eachThing.high_price}gp</SuperTD>
</TableRow>
)}
))}
由于缺少工作代码,我没有运行;我可能有错误的 brackets/closing 个括号,也可能放在错误的位置,但总的来说它应该会指导您找到解决方案。
感谢@John 的协助。
我的设计过于复杂了。我的 JSON 文件包含数组和对象,导致导航不便。
将其重组为仅包含数组后,就容易多了。
此外,至于实际问题,有人告诉我我需要在原来的地图函数中添加另一个地图函数,以使其以正确的方式吐出数据。
//...
Object.values(thing).map((innerThing, innerIndex) => (
<>
{console.log("\nouter/inner: "+outerIndex +", " +innerIndex)}
{console.log("\nData: \n\t"+innerThing[2] +"\n\t" +innerThing[8] + "\n\t" +innerThing[3]+"\n\t" + innerThing[4]+"\n\t"+innerThing[5])}
<TableRow key = {thing[0].toString()}>
<SuperTD>{innerThing[2]}</SuperTD>
<SuperTD>{innerThing[8]}lbs</SuperTD>
<SuperTD>{innerThing[3]}gp</SuperTD>
<SuperTD>{innerThing[4]}gp</SuperTD>
<SuperTD>{innerThing[5]}gp</SuperTD>
</TableRow>
</>
//...
现在,映射排序后,结果如下: