TypeScript получить объект, вложенный в JSON - PullRequest
0 голосов
/ 18 июня 2020

У меня есть объект JSON:

"product": [
  {
    "code": "A",
    "value": "A",
    "id": 1,
    "subproduct": [
       { "name": "C", "id": 31 },
       { "name": "S", "id": 32 }
    ]
  }
]

Я хочу получить вспомогательный продукт с идентификатором продукта JSON получен службой Я пробую следующий код:

let result = this.dataService.getJSON().pipe(
   map((x) => x.product),
   filter((y) => y.id === 1)
);

* ОБНОВЛЕНИЕ *

Если я попробую код, у меня будет код = "A"

this.dataService.getJSON().pipe(map((x) => x.product.filter((x) => x.id === 1)));

Но это не работает, почему Я не могу получить вложенный объект «субпродукт»

Если я напишу

return this.dataService.getJSON().pipe(map((x) => x.product.subproduct.filter((x) => x.id === 1)));

У меня эта ошибка

ERROR TypeError: "x.product.subproduct is undefined"

ОЖИДАЕМЫЙ РЕЗУЛЬТАТ

ниже ожидаемого результата, мне нужен только субпродукт

[
  { "name": "C", "id": 31 },
  { "name": "S", "id": 32 }
]

Спасибо за вашу помощь

Ответы [ 3 ]

0 голосов
/ 18 июня 2020

Когда вы передаете оператор с Observable по filter - вы фактически фильтруете выбросы этого Observable. Чтобы работать с фактическими значениями, которые испускает Observable, вам нужно поместить все преобразования внутри оператора map.

let result = this.dataService.getJSON().pipe(
   map((data) => {
     return data.product.find((p) => p.id === your_id)
   }),
);
0 голосов
/ 20 июня 2020

Вы должны определить result наблюдаемый поток с желаемым выходом и подписаться на него.

let result = this.dataService.getJSON().pipe(
  pluck('product'),
  map(products => {
    const product = products.find(eachProduct => eachProduct.id === 1);
    return product && product.subproduct;
  }),
);

Теперь вы можете подписаться на result наблюдаемый, чтобы получить subproduct массив

result.subscribe(subproduct => {
  // You have access to subproduct array here.

  console.log(subproduct)
})

Если продукт с id не найден, вы получите undefined субпродукт в подписке при условии, что этот субпродукт всегда существует для данного продукта.

0 голосов
/ 18 июня 2020

Вот решение. Надеюсь, это сработает!.

const product = [
      {
          "code": "A",
          "value": "A",
          "id": 1,
          "subproduct": [
               { "name": "C", "id": 31 },
               { "name": "S", "id": 32 }
          ]
      }
    ];
    const results = product.find(item => item.id === 1).subproduct;
    console.log(results);
...