【问题标题】:*ngFor Angular through nested array with different keys and level*ngFor Angular 通过具有不同键和级别的嵌套数组
【发布时间】:2018-04-16 19:35:05
【问题描述】:

我有一个“不对称”结构的对象数组,其中键不相同并且有一些嵌套对象。 我需要遍历这个:

  obj = [{
      "d14042018": {
        "date": "14-04-2018",
        "value": 5
      },
      "d02042018": {
        "date": "02-04-2018",
        "value": 10
      },
      "name": "my name"
    },
    {
      "d14042018": {
        "date": "14-04-2018",
        "value": 15
      },
      "d02042018": {
        "date": "02-04-2018",
        "value": 25
      },
      "name": "my second name"
    }]

我需要的是返回这样的结构

第一行 = 我的名字 5 10

第二行 = 我的第二个名字 15 25

我在自定义管道中尝试了 for...

    import { Pipe, PipeTransform } from '@angular/core';
    @Pipe({
      name: 'keys'
    })
    export class KeysPipe implements PipeTransform {

      transform(value: any, args?: any): any {
        let keys: string;

        if (value) {
          for (var prop in value) {
      
            if(typeof value[prop] != 'object') {
               keys = value[prop];
            } else {
              for (var subprop in prop) {
                keys = prop.subprop;
              }
            }
          }
        }
        return keys;
      }
    }

但是 id 不起作用...

有人可以帮忙吗?

【问题讨论】:

  • 键名始终存在,但您猜的日期可能会改变...所以我不知道日期键的名称
  • 如此糟糕的设计:无论如何,如果您使用Object.keys() 捕获键(无论值如何),那么您就有了可以迭代的东西。如果结构保持不变,您可以使用键索引来收集 value 和下一个键来获取第二个值,并使用第三个键(名称)来获取名称。

标签: javascript angular pipe for-in-loop nest-nested-object


【解决方案1】:

我建议避免使用 Pipe 进行此类高级数据操作,而只需在 ngOnInit() 或绑定到公共变量之前生成显示/使用所需的数据结构。您可以将Object.keys()Array.prototype.map()Array.prototype.join() 和三元语句结合使用来生成数据行。

TypeScript:

this.rows = Object.keys(obj).map(key => {
  const o = this.data[key];
  const { name } = o;
  const values = Object.keys(o)
                   .map(k => o[k]['value'])
                   .join(' ');

  return { name, values };
});

HTML:

<ul>
  <li *ngFor="let row of rows">{{row.name}} {{row.values}}</li>
</ul>

这里有一个example 正在使用中。

希望对您有所帮助!

【讨论】:

  • 如果值为 0,它将被替换为 '' 因为它是虚假的 :)
【解决方案2】:

一个选项是将每个对象的键减少为一个数组,然后如果您希望每个项目都是一个字符串,则只需加入:

const obj = [...]; // your example array
const flattened = obj.map(
    o => Object.keys(o).reduce(
        (acc,cur) => cur === 'name' 
            ? [o[cur], ...acc] // key is 'name', push value to first
            : [...acc, o[cur].value] // other than name, push value of value last
        , []).join(' ')
    );

【讨论】:

  • 谢谢老兄,我更喜欢 alex 方法。你太棒了
猜你喜欢
  • 2020-01-23
  • 2016-06-21
  • 1970-01-01
  • 2023-03-02
  • 1970-01-01
  • 2022-10-16
  • 2019-02-07
  • 1970-01-01
  • 2020-03-17
相关资源
最近更新 更多