Typescript, повторяющий многомерный json

У меня есть многомерный 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?

У меня нет возможности протестировать, и я не очень разбираюсь в Typescript, но я почти уверен, что вам нужно добавить parts = [] после того, как вы отправите детали поставщику. В противном случае вы продолжаете повторно использовать один и тот же массив для всех поставщиков и привязывать один и тот же массив частей ко всем поставщикам. Обратите внимание: даже после добавления массива частей к поставщику, если вы добавите больше в этот массив, поставщик теперь будет иметь эти части, потому что вы изменили массив. Еще лучшим решением было бы получить новый массив частей в начале каждой итерации цикла.

Nate 09.10.2018 04:34

Думаю, я понял, что вы имеете в виду, но не знаю, как это реализовать.

wilfrank 09.10.2018 05:14

В качестве очень простого доказательства концепции замените слово const на let в строке «const parts: Part [] = [];`. Это позволит вам позже установить его в новый массив. Затем сразу после suppliers.push(supplier); добавьте parts = [];. Это даст вам свежий массив для вашего следующего поставщика.

Nate 09.10.2018 05:20

@krishna только что опубликовал альтернативный (лучший) пример, который я пытался описать, который должен иметь свежий массив для каждого поставщика с самого начала.

Nate 09.10.2018 05:22
collection[key] не должен быть collection[i][j]?
James 09.10.2018 05:24

@ Джеймс, да, здесь что-то определенно не так. Я думаю ты прав.

Nate 09.10.2018 05:29
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
6
126
1

Ответы 1

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
)

}

Другие вопросы по теме