【问题标题】:Angular2,Ionic2:How to access an array of objects inside another array of objects in typescript?Angular2,Ionic2:如何访问打字稿中另一个对象数组中的对象数组?
【发布时间】:2017-04-05 12:32:52
【问题描述】:

我对在 angular2 中使用数组的概念完全陌生。我的 JSON 数据来自后端,存储在一个名为“arr”的数组中。但是我想访问一个存在于“arr”中的每个对象中的数组,即“arr”中的每个对象都有一个包含一些元素的数组。我想在我的 .ts 文件而不是 HTML 文件中访问该数组。我需要在 .ts 文件中对其进行一些修改,所以我想知道如何为其创建管道。

我读到我们需要使用管道。但我不明白如何为此使用管道。 如果您在图片中看到有一个包含 3 个对象的主数组,并且 3 个对象中的每一个都有一个名为 categories 的数组,该数组又包含对象。我想访问主数组中存在的所有 3 个对象的类别内的字段“类别”。有人可以帮我做吗?

【问题讨论】:

    标签: angular object typescript ionic2 arrayofarrays


    【解决方案1】:

    如果是在 html 中

    <div *ngFor="let item of arr">
     {{item.aliasname}}
     <div *ngFor="let category of item.categories">
        {{category.name}}
     </div>
    </div>
    

    在类型脚本中,您可以使用 foreach 循环

    arr.forEach(element => {
        element.forEach(category => {
           console.log(category.name);
           // Do whatever you want
           // You can access any field like that : category.yourField
        });
    });
    

    An other way to foreach in Angular2

    【讨论】:

    • 谢谢。但很抱歉我想在打字稿中这样做。
    • @Impromptu_Coder 我已经添加了它;)
    • @Impromptu_Coder 这是我的回答,第二部分
    • @Impromptu_Coder 如果您不提供任何代码行,将无法更进一步。我向您展示了如何在 Angular2 中循环遍历嵌套数组。没有任何代码不能做得更好。
    • this.http.get('results/exams',{ }).subscribe(resp=>{ this.searchResults = resp.data; console.log(this.searchResults); }, 错误=>{console.log(err);}, ()=>{}); this.searchResults.forEach(element => { element.forEach(category => { console.log(category.name); }); });这是我尝试过的,它显示了我上面提到的错误。我的 API 调用正常。
    【解决方案2】:

    这里不需要管道,管道将用于在模板中实际显示数据,例如,如果您需要迭代对象键,这不能与 *ngFor 一起使用。但是既然要操作组件中的数据....

    您需要两个forEaches 才能访问不同对象中的每个类别。您需要在收到数据后从回调(订阅)中执行此操作,这里有更多信息:How do I return the response from an Observable/http/async call in angular2?

    我建议你在服务中进行http请求,并订阅组件中的数据,所以在你的组件中,调用该服务方法并订阅响应,然后使用forEach:

    ngOnInit() {
      this.service.getData()
        .subscribe(data => {
          this.searchResults = data;
          // call method or manipulate data here since response has been received
          this.manipulateData();
        });
    }
    
    manipulateData() {
        this.searchResults.forEach((x:any)=> { // iterate outer array
          x.categories.forEach((y:any) => { // iterate the categories of each object
            console.log(y.name) // ... or whatever properties you have
            // manipulate your data
          })
        })
    }
    

    DEMO

    【讨论】:

    • 非常感谢。它正在工作。你让我今天一整天都感觉很好。我有一个疑问,我确实在 service.ts 文件中编写了我的服务调用并在我的组件中使用了它。所以我所做的是我在订阅中调用了函数“manipulateData()”,然后在这个操作数据()中我写了 2 foreachs。但它没有用。所以我直接在订阅中编写了forEachs,它可以工作。这有什么原因吗?还要进一步补充我的问题。你能告诉我如何只获取唯一的类别 ID 而不是所有类别 ID?
    • 很难说为什么它不能与 manipulateData- 方法一起工作,因为没有看到你的任何代码。它应该工作,就像我在 plunker 中提供的那样。至于你的第二个问题,你必须编写一些逻辑来从你的数据中过滤唯一的唯一 id ......我认为这将是一个非常接近你的问题:) stackoverflow.com/questions/15125920/…
    • this.Service.getData.subscribe(resp=>{ this.searchResults = resp.data; this.searchResults.forEach((x:any)=> { x.categories.forEach((y :any) => {object this.category=y.categoryid; console.log(this.category); }) }); 这行得通。但是这个行不通 this.testService.post('search/getSearchResults' ,this.searchobj).subscribe(resp=>{ this.searchResults = resp.data; this.manipulatedata(); }) });
    • 你的第二个 sn-p 代码是错误的,所以把它扔掉。你的第一个看起来不错,但不是在订阅中执行 foreach ,而是可以调用一个方法并在那里执行 for each ,就像我的回答所建议的那样。但这不是必需的。这取决于你。
    猜你喜欢
    • 2019-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-18
    • 1970-01-01
    • 2017-09-01
    • 2021-09-19
    • 2021-05-21
    相关资源
    最近更新 更多