如何使用不同的键映射多维数组? 这是一个类似的示例数组:(我的原始数组是从ajax和PHP mysql查询获得的,这就是我需要这样做的原因):
var products = [
{
id: 1,
name: 'John',
phones: {
sony:
{
brand: 'sony',
model: 'z3'
},
samsung:
{
brand: 'samsung',
model: 's7'
}
}
},
{
id: 2,
name: 'Mike',
phones: {
sony:
{
brand: 'sony',
model: 'z1'
},
nokia:
{
brand: 'nokia',
model: 'n8'
}
}
}
];
如果我尝试映射此数组,我会得到:'未捕获TypeError:product.phones.map不是函数':
const List = ({ products, addToCart }) => {
return (
<div className="odds-3">
<div className="odds">
{products.map((product, index) =>
<div key={index}>
<p>{product.id} - {product.name}</p>
<ul>
{product.phones.map((phone, index) =>
<li key={index}>{phone.brand} - {phone.model}</li>
)}
</ul>
</div>
)}
</div>
</div>
);
}
使用此阵列(没有电话键),工作正常:
var products = [
{
id: 1,
name: 'John',
phones:
[{
brand: 'sony',
model: 'z3'
},
{
brand: 'samsung',
model: 's7'
}
]
},
{
id: 2,
name: 'Mike',
phones:
[{
brand: 'sony',
model: 'z1'
},
{
brand: 'nokia',
model: 'n8'
}
]
}
];
答案 0 :(得分:3)
products
不是数组,因此map
函数无法正常工作。试试
{Object.keys(product.phones).map((phone, index) =>
<li key={index}>{product.phones[phone].brand} - {product.phones[phone].model}</li>
)}
代替。
答案 1 :(得分:0)
在您的第一个示例中,手机属性为object
而不是array
,因此没有map
功能
第二个作品phones
是array
。
答案 2 :(得分:0)
正如我之前的其他人告诉你的那样,products
不是一个数组,因此你无法在其上使用地图功能。
尽管如此,您可以使用map
库中的lodash
函数来迭代对象键/值:
import map from 'lodash'
{map(product, (value, key) =>
...
)}
有关详情,请参阅here
答案 3 :(得分:0)
在JavaScript中,数组的工作方式略有不同。在您的情况下,插入修复将迭代对象的值,如下所示:
{products.map((product, index) =>
<div key={index}>
<p>{product.id} - {product.name}</p>
<ul>
{Object.values(product.phones).map((phone, index) =>
<li key={index}>{phone.brand} - {phone.model}</li>
)}
</ul>
</div>
)}
虽然有些浏览器仍然不支持Object.values()
,但是转换步骤应该解决这个问题。
请注意,通常不建议使用索引作为键,因为如果迭代的排序或内容发生变化,您可能会得到weird rendering bugs。