1

尝试在 Angular 中实现管道。在意识到 ngFor 不适用于地图之后。一些研究让我相信未来的功能将会解决这个问题,但与此同时,mapToIterable 管道就是答案。

我有以下代码:

import {Pipe, PipeTransform} from '@angular/core';

@Pipe({
  name: 'mapToIterable'
})
export class MapToIterablePipe implements PipeTransform  {
  transform(map: Map<string, Object>, args: any = []): any {
    const a: any[] = [];
    console.log(map.keys());  // <- works as expected
    for (const k in map) {
      if (map.has(k)) {
        console.log("hello");  // <- never executes
        console.log(k);
        a.push({key: k, val: map.get(k)});
      }
    }
    console.log(a); // <- always empty
    return a;
  }
}

export const MAPTOITERABLE_PROVIDERS = [
  MapToIterablePipe
];

map.keys() 给了我一个正确键的列表,但没有其他工作。

关于如何诊断为什么我的循环没有正确填充数组的任何建议?

4

1 回答 1

3

Map'keys' 不是对象键,不能使用Object.keys()orin运算符获得。

考虑到map.keys()返回一个可迭代的,它应该是

for (const key of Array.from(map.keys())) {
  // this check is unneeded
  // if (map.has(k)) {
  ...
}

或者在带有选项的TypeScript 2.3 中downlevelIteration

for (const key of map.keys()) { ... }

要不就

const a: any[] = Array.from(map.entries()).map(([key, val]) => ({ key, val }));

由于 TypeScript 实现扩展运算符[...iterable]的方式,其工作方式与Array.from(iterable)2.2 及更低版本不同。

于 2017-05-14T13:43:15.953 回答