javascript - 带有动态键的 TypeScript array.map()
问题描述
我有一个Foo
被调用的数组fooArray
,但我希望map()
该数组只包含在arrayOfKeys
.
class Foo {
id: number;
name: string;
age: number;
constructor(id: number, name: string, age: number) {
this.id = id;
this.name = name;
this.age = age;
}
}
let fooArray: Foo[] = [
new Foo(1, 'Foo', 20),
new Foo(2, 'Bar', 21),
new Foo(3, 'MyFoo', 20)
];
//The keys I would like to select from Foo.
const arrayOfKeys: (keyof Foo)[] = ['name', 'age'];
我不知道该怎么做才能得到下面的预期结果:
// The result is a copy of 'fooArray', but the objects only
// contain the keys (and their values) defined in 'arrayOfKeys'.
[
{ name: 'Foo', age: 20 },
{ name: 'Bar', age: 21 },
{ name: 'MyFoo', age: 20 }
]
解决方案
您可以通过在地图中创建一个新对象并返回它来做到这一点?
就像是
const fooArrayWithLimitedKeys = fooArray.map(item => arrayOfKeys.reduce(
(accumulator, key) => {
accumulator[key] = item[key]
return accumulator
}, {})
)
也可以不写reduce
如下:
const fooArrayWithLimitedKeys = fooArray.map(item => {
const returnValue = {}
arrayOfKeys.forEach(key => {
returnValue[key] = item[key]
})
return returnValue;
})
推荐阅读
- shell - 如何将变量从 AppleScript 传递到 shell 命令?
- jquery - POST 端点正在接收空值
- azure-devops - ARM - 如何从存储帐户获取访问密钥,以便稍后在模板中的 sql server 审核设置中使用
- docker - Ubuntu 上的 Docker 无法连接到 localhost
- asp.net - 为什么通过长期建立的 B2C 租户成功登录会开始导致未经身份验证的用户主体?
- python - Python 中 numpy.argmax(array) 和 array.argmax() 的区别
- kubernetes - 将 skaffold 配置文件绑定到命名空间
- css - Angular Materials Table 展开和折叠表格单元格?
- java - Dagger2+Retrofit 使用 Subcomponent 更改 URL:如果没有 @Provides- 或 @Produces-annotated 方法,则无法提供
- ssl - 用于限制服务器访问特定机器的 SSL 客户端和服务器证书