Я использую TypeScript, и я немного новичок в этом. У меня есть такой массив, но ключи в 'orderBreakdownList' ("8" и "восходящий тренд") будут неизвестны приложению каждый раз, когда оно загружается.
{
"userId": "00bdad66",
"totalNumberOfOrders": 5,
"totalNumberOfPackages": 54521,
"totalNumberOfItems": 13,
"totalNumberOfDeliveredOrders": 3,
"totalPrice": 39409.0,
"orderBreakdownList": [
{
"8": {
"noOfItems": 1,
"noOfPackages": 17160,
"id": 8,
"totalPrice": 3741.52,
"orderItems": [
{
"upward-trending": {
"tag": "upward-trending",
"value": 6653.16,
"price": 18798.89,
"id": 76
}
}
]
}
}
]
}
Я пытаюсь отобразить массив orderBreakdownList, внутри которого есть объекты, и отобразить второй массив в список. (Выпадающая таблица с данными по одному элементу)
это то, что я пробовал до сих пор,
<div>
{orderBreakdownList.map((items, index) => {
return (
<ol key = {index}>
{items.map((subItems, sIndex) => {
return <li key = {sIndex}> {subItems} </li>;
})}
</ol>
);
})}
</div>
Но я не заставляю это работать и не получаю никаких данных. Может быть, мне нужна другая карта в него? Мне нужна помощь, пожалуйста.
Обновлено: По предложению @rantao я придумал следующий код. Использование только html без рамки CSS.
<div>
{orderBreakdownList.map((orderBreakdown, i) => {
const keyName = Object.keys(orderBreakdown);
return (
<div key = {i}>
Order number: {keyName}
{Object.values(orderBreakdown).map(
(
{ noOfItems, noOfPackages, id, totalPrice, orderItems }: any,
i
) => {
return (
<div key = {i}>
<div>Id: {id}</div>
<div>Nr. of items: {noOfItems}</div>
<div>Nr. of packages: {noOfPackages}</div>
<div>Total price:{totalPrice}</div>
<ul>
{orderItems.map((item: any) =>
Object.values(item).map(
({ tag, value, price, id }: any) => (
<li key = {id}>
<div>Id: {id}</div>
<div>Tag: {tag}</div>
<div>Value: {value}</div>
<div>Price: {price}</div>
</li>
)
)
)}
</ul>
</div>
);
}
)}
</div>
);
})}
</div>
Вы не можете отображать items как объект.
@James OP сказал, что 8 и upward-trending будут неизвестны, поэтому вы не можете явно сделать items.8.orderItems, потому что ключ неизвестен. Смотрите мой ответ, в котором используются Object.values и Object.entries, чтобы смягчить это ограничение.
@rantao, конечно, пункт был «не сопоставлять элементы, это не массив»



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


items — это объект, и вы можете получить подэлементы, получив ключи объекта. Затем вы можете улучшить это оттуда
<div>
{orderBreakdownList.map((items, index) => {
let keyName = Object.keys(items);
return (
<ol key = {index}>
<li> {items[keyName]} </li>;
</ol>
);
})}
</div>
Я предполагаю, что когда вы говорите «второй массив», вы имеете в виду orderItems внутри массива orderBreakdownList. В этом случае вы бы сделали что-то вроде этого:
<div>
{orderBreakdownList.map(orderBreakdown => (
<ol>
{Object.values(orderBreakdown).map(({ orderItems }) => (
orderItems.map(item => (
Object.values(item).map(({ tag, value, price, id }) => (
<li key = {id}>
<div>{tag}</div>
<div>{value}</div>
<div>{price}</div>
</li>
))
))
))}
</ol>
))}
</div>
Object.values() принимает значения объекта без явного определения ключей — 8 и upward-trending в данном случае. Если вы хотите узнать, что такое ключ, замените Object.values() на Object.entries(), который возвращает массив кортежей, содержащих key и value объекта.
Например:
Object.entries(item).map(([key, value]) => {
// Map nested item
})
Спасибо за ваш очень подробный и четкий ответ, много "приятностей". Я нахожу массивы забавными, но сложными. Что, если я хочу отобразить как значение ключей, так и объекты? Должен ли я запускать Object.value() в родительском массиве? (В данном случае цифра 8)
Без проблем! В этом случае используйте Object.entries вместо Object.values. Пример уже есть в моем ответе
itemsне является массивом, поэтому вы не можете его сопоставить.items(лучше называтьitem) — это отдельный элемент в массиве orderBreakdownList. Отдельный элемент, который я вижу, имеет одно свойство8с объектом в качестве значения, и этот объект имеет свойство orderItems. Так что вам нужно вместоitems.map,items.8.orderItems.map. Не уверен, что это за 8, похоже на запах кода.