Как перебрать многовложенный объект JSON для функции раскрывающегося списка в Angular 6?

Я работаю в Angular 6.0 и столкнулся с проблемой использования HttpClient для повторения моих данных JSON, которые я читаю из локального файла в папке с ресурсами.

Вот мои данные JSON

[{
    "configKey": [{
        "user1": [{
            "subconfig": [{
                "name": "program Id",
                "type": "String"
            }, {
                "name": "brand ID",
                "type": "String"
            }]

        }],
        "user2": {
            "subconfig": [{
                "name": "program Id",
                "type": "String"
            }, {
                "name": "brand ID",
                "type": "String"
            }]
        },

        "user3": {
            "subconfig": [{
                "name": "program Id",
                "type": "String"
            }, {
                "name": "brand ID",
                "type": "String"
            }]
        }
    }]
}]

Вот мой текущий код в файле компонента ts

  rule:Array<any> =[];

  loadinfo(){
    this.http.get<any[]>("assets/test.json")
    .subscribe(data=>{
      this.rule = data;
    })
  }

Вот что у меня есть в файле HTML


  <label>
    <select>
      <option *ngFor = "let og of rule">
        {{og.configKey}}
      </option>
    </select>
  </label>

В моей ожидаемой конечной цели я должен иметь возможность заполнить раскрывающийся список на основе предыдущего выбора. (например, я выбираю user1, список должен быть заполнен «именами» в его дереве пользователей в JSON). Однако я еще не добрался до этой части и просто хотел бы помочь с простым заполнением раскрывающегося списка именами из моего дерева JSON.

Из моего предыдущего исследования я понял, что HttpClient возвращает только объекты, а *ngFor работает только с массивами. Я попытался изменить объект на массив, но мой результат — это просто еще одна ошибка, в которой говорится, что ngFor может выполнять итерацию только по объектам. Есть ли способ изменить весь мой вложенный объект JSON на массив?

Для чего это стоит, вот мои данные JSON в консоли Консоль JSON

Как мне сделать мои данные итерируемыми с помощью * ngFor и как мне перейти к именам? Я бы предположил, что в html это будет что-то вроде этого? :

//TEST CODE????

  <label>
    <select>
      <option *ngFor = "let og of rule">
        {{og.configKey.user1.subconfig.name}}
      </option>
    </select>
  </label>

Любая помощь будет оценена по достоинству! заранее спасибо

Нет такой вещи, как объект JSON.
Heretic Monkey 13.02.2019 22:11
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
3
1
1 663
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете перебирать объекты с помощью keyvalue трубы. (https://angular.io/api/common/KeyValuePipe)

Вы можете сделать это следующим образом:

<div *ngFor = "let config of res | keyvalue">
  <div>{{config.key}}</div>
  <div *ngFor = "let users of config.value">
    <div *ngFor = "let user of users | keyvalue">
      <div>{{user.key}}</div>
      <div *ngFor = "let subcfgs of user.value | keyvalue">
        <div>{{subcfgs.key}}</div>
        <div *ngFor = "let subcfg of subcfgs.value">
          <div>name: {{subcfg.name}}</div>
          <div>type: {{subcfg.type}}</div>
        </div>
      </div>
    </div>
  </div>
</div>

стекблиц: https://stackblitz.com/edit/angular-ph76ya

Я отредактировал ваш JSON.

Эй, спасибо! Это действительно полезно! Я обновил свой angular, чтобы иметь возможность использовать KeyValue Pipe, и он работает. У меня есть еще один вопрос, если вы не против помочь мне. Есть ли конкретный способ, которым я могу выполнить итерацию для конкретного пользователя? Скажем, я хочу показать раскрывающееся имя и тип только для определенного пользователя. Как бы я перешел к этому конкретному пользователю? Я попытался изменить «пользователей» на что-то вроде «users.user1», но это, похоже, не сработало... Еще раз спасибо!

Jack N 14.02.2019 21:52

Как насчет использования *ngIf для отображения конкретного пользователя? лайк *ngIf = "user.key === 'specificUserName'"

zmag 15.02.2019 02:07

@zmag Как это вложенное значение может быть заполнено в раскрывающемся списке / выборе? Например, список имен.

NiAu 17.06.2019 22:09

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