У меня есть многомерный JSON, который мне нужно перебрать и адаптировать к объекту машинописного текста, отформатированному для моего представления.
{
"data": {
"id": "71",
"type": "quotations",
"attributes": {
"parts": {
"name supplier 1": [
{
"id": 1,
"part_number": "10-09800",
"title": "FALCON ACCELEROMETER G METER -5G TO +10G",
"supplier_id": 1
},
{
"id": 3,
"part_number": "1999",
"title": "Peça teste",
"supplier_id": 1
}
],
"name supplier 2": [
{
"id": 2,
"part_number": "10-09800",
"title": "FALCON ACCELEROMETER G METER -5G TO +10G",
"supplier_id": 2
}
]
}
}
}
}
Как выполнить итерацию этого JSON, разделяя элементы в соответствии с их поставщиками.
private responseToQuotationSuppliers(response: Response): QuotationSupplier {
const collection = response.json().data.attributes['parts'];
const suppliers: QuotationSupplierPart[] = [];
const parts: Part[] = [];
for (const i in collection) {
for (const j in collection[i]) {
collection[key].forEach(item => {
let part = new Part(
item.id,
item.part_number,
item.tile,
item.supplier_id
)
parts.push(part);
})
}
let supplier = new QuotationSupplierPart(
key,
parts
)
suppliers.push(supplier);
}
return new QuotationSupplier(
suppliers,
response.json().data.id
)
}
Я так и делаю, но все поставщики получают все по частям.
Может ли кто-нибудь дать мне свет для правильной итерации этого JSON?
Думаю, я понял, что вы имеете в виду, но не знаю, как это реализовать.
В качестве очень простого доказательства концепции замените слово const на let в строке «const parts: Part [] = [];`. Это позволит вам позже установить его в новый массив. Затем сразу после suppliers.push(supplier); добавьте parts = [];. Это даст вам свежий массив для вашего следующего поставщика.
@krishna только что опубликовал альтернативный (лучший) пример, который я пытался описать, который должен иметь свежий массив для каждого поставщика с самого начала.
collection[key] не должен быть collection[i][j]?
@ Джеймс, да, здесь что-то определенно не так. Я думаю ты прав.



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


private responseToQuotationSuppliers(response: Response): QuotationSupplier {
const collection = response.json().data.attributes['parts'];
const suppliers: QuotationSupplierPart[] = [];
for (const i in collection) {
let parts: Part[] = [];
for (const j in collection[i]) {
collection[key].forEach(item => {
let part = new Part(
item.id,
item.part_number,
item.tile,
item.supplier_id
)
parts.push(part);
})
}
let supplier = new QuotationSupplierPart(
key,
parts
)
suppliers.push(supplier);
}
return new QuotationSupplier(
suppliers,
response.json().data.id
)
}
У меня нет возможности протестировать, и я не очень разбираюсь в Typescript, но я почти уверен, что вам нужно добавить
parts = []после того, как вы отправите детали поставщику. В противном случае вы продолжаете повторно использовать один и тот же массив для всех поставщиков и привязывать один и тот же массив частей ко всем поставщикам. Обратите внимание: даже после добавления массива частей к поставщику, если вы добавите больше в этот массив, поставщик теперь будет иметь эти части, потому что вы изменили массив. Еще лучшим решением было бы получить новый массив частей в начале каждой итерации цикла.