【问题标题】:*ngFor - Loop two arrays in the same level*ngFor - 在同一级别循环两个数组
【发布时间】:2019-02-25 17:16:27
【问题描述】:

我正在尝试使用一个 *ngFor 循环两个数组,但它没有在浏览器上显示任何元素。我有下面的 HTML 文件示例,还初始化了组件文件中的数组。

HTML 文件:

<tbody *ngIf="feedbacks.length">
          <ng-container *ngFor="let fd of feedbacks;let res of results;let i=index">
            <tr>
              <td>{{ i }}</td>
              <td>{{fd}}</td>
              <td colspan="2">
                <ul>
                  <div *ngFor="let obj of res">
                    <td>Score: {{res.score}}</td>
                    <td>Emotion: {{res.tone_name}}</td>
                  </div>
                </ul>
              </td>
            </tr>
          </ng-container>
        </tbody>

打字稿文件:

  results = [];
  feedbacks = [];

  ngOnInit(){

    this.feedbacks = ["Le système est trop lent ", "Le top! Un exemple d'excellence.", "C'est quoi ce bordel !"]; 

    this.results = [
      [{score: 0.535632, tone_id: "anger", tone_name: "Colère"}],
      [{score: 0.633569, tone_id: "anger", tone_name: "Colère"},
       {score: 0.506763, tone_id: "analytical", tone_name: "Analytique"}],
      [{score: 0.895438, tone_id: "joy", tone_name: "Joie"}]  
    ];
    console.log(this.results);

  }

【问题讨论】:

  • 您在寻找 Test: {{obj.score}} 吗?
  • 是的,我想显示分数和tone_names的每个反馈列表。任何想法!

标签: arrays angular ngfor


【解决方案1】:

ngFor 结构指令仅接受单个可迭代对象作为输入。它不会接受多个数组。我建议不要尝试遍历两个单独的数组,而是创建一个数组(前提是两个数组的长度相同)。

// HTML

<tbody *ngIf="feedbacks.length">
   <ng-container *ngFor="let item of combinedArray;let i=index">
     <tr>
       <td>{{ i }}</td>
       <td>{{fd}}</td>
         <td colspan="2">
           <ul>
             <div *ngFor="let obj of item.result">
               <td>Test: {{obj.score}}</td>
             </div>
           </ul>
       </td>
    </tr>
  </ng-container>
</tbody>

// Typescript

combinedArray: { feedback: any, results: any }[] = [];

ngOnInit(){
  ...

  this.feedbacks.forEach((fb, index)
    => this.combinedArray.push({ feedback: fb, result: this.results[index] }));
}

【讨论】:

    【解决方案2】:

    你应该稍微修改一下你的模板:

    <tbody *ngIf="feedbacks.length"> <ng-container *ngFor="let feedback of feedbacks;let i=index"> <tr> <td>{{ i }}</td> <td>{{feedback}}</td> <td colspan="2"> <ul> <div *ngFor="let result of results[i]"> <td>Test: {{result.score}}</td> </div> </ul> </td> </tr> </ng-container> </tbody>

    这假设数组中的索引彼此对应。另一种解决方案是将您的模型修改为以下内容:

    feedbacks = [{ value: "Le système est trop lent ", results: [{score: 0.535632, tone_id: "anger", tone_name: "Colère"}] }];

    并使用两个嵌套的*ngFors 进行迭代。

    【讨论】:

    • 谢谢@Ludevik,您能否展示结合两个数组的打字稿方法,因为这些数组不是静态的。只是为了测试。
    • 我不会在前端这样做,而是在后端这样做,因此该模型更有意义,并且明确了哪些结果对应于哪些反馈。在当前的解决方案中,存在两个数组必须按正确顺序排列的问题,因此数据不会不匹配。不管你是在 html 中还是在 typescript 中迭代它,问题仍然存在。
    【解决方案3】:

    为此使用let obj of results[i]

    <tbody *ngIf="feedbacks.length">
        <ng-container *ngFor="let fd of feedbacks;let i=index">
            <tr>
                <td>{{ i }}</td>
                <td>{{fd}}</td>
                <td colspan="2">
                    <ul>
                        <div *ngFor="let obj of results[i]">
                            <td>Test: {{obj.score}}</td>
                        </div>
                    </ul>
                </td>
            </tr>
        </ng-container>
    </tbody>
    

    【讨论】:

    • 我也同意这个答案以及@Ludevik 提供的最干净和最简单的方法。
    【解决方案4】:
    <ng-container *ngFor="let fd of feedbacks;index as i">
    <ng-container *ngFor="let res of results;index as j>
        <ng-container *ngIf="i===j">
        {{Here You can access fd and res of same index}}
        <ng-container>
    </ng-container>
    </ng-container>
    

    在 angular11 上尝试了类似的代码,它正在工作。

    【讨论】:

      【解决方案5】:

      试试这个?

      <tbody>
              <tr *ngFor="let fd of feedbacks;let i=index">
                  <td>{{ i }} </td>
                  <td>{{fd}} {{results[i].score}}</td>
                  <td>{{fd}} {{results[i].tone_id}}</td>
                  <td>{{fd}} {{results[i].tone_name}}</td>
              </tr>
      </tbody>
      

      【讨论】:

        猜你喜欢
        • 2016-01-15
        • 2016-05-08
        • 1970-01-01
        • 1970-01-01
        • 2021-06-04
        • 1970-01-01
        • 2023-03-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多