我有一个帐户的名称数组。每个人可以有一个以上的类型。类型是一个枚举..它应该替换其定义的值。希望按accountNumber,firstName,lastName分组,而不是类型。
export interface Name {
accountNumber: string;
firstName: string|null;
lastName: string|null;
type: AccountType;
}
export enum AccountType{
primary = 0,
secondary = 1
}
const names =[
{
"accountNumber":"0000001420",
"firstName":"KELLY",
"lastName":"WHITE",
"type":0
},
{
"accountNumber":"0000001420",
"firstName":"RAY",
"lastName":"WHITE",
"type":0
},
{
"accountNumber":"0000001420",
"firstName":"KELLY",
"lastName":"WHITE",
"type":1
}
]
我想要一个具有以下格式的输出数组:
[{
firstName:"KELLY",
lastName:"WHITE",
accountNumber:"0000001420",
types: [primary, secondary]
}, {
firstName: "RAY",
lastName: "WHITE",
accountNumber: "0000001420",
types: [primary]
}]
我试着用Reduce…
const merged2 = names.reduce((r, { accountNumber, firstName, lastName,type }) => {
const key = `${accountNumber}-${firstName}-${lastName}`;
r[key] = r[key] || { accountNumber, firstName, lastName, types: [] };
r[key]["types"].push(type)
return r;
}, {})
我在r[key]处出错
元素隐式具有“any”类型,因为“string”类型的表达式不能用于索引类型“{}”。在类型“{}”上未找到具有“string”类型参数的索引签名。
如何修复错误,或者是否有其他方法来获得结果,而不是Reduce函数?
以下是TS Playground的链接:https://www.typescriptlang.org/play?ssl=20&ssc=2&pln=1&pc=1#code/MYewdgzgLgBGCGBbAphGBeA2gKBng3rnsQEQqIBGyATgHICulNJAXCQAydcCMALAEzsSAGiLEYJAGYBLatFpJkrEgGkAogBkNATRFjSAG3jzFygOoAJAJIAVNXvF4SUAJ4AHJS3ZiAvqOKEjhLkVHSMocpcPAJC-o5SsiYoygBKAIK6ceIkRkmeJJa29lmkrh6s3sR+YoHxITQMTNSRUex8gg7xMnJQCsls6lqZ+k65vaZshXad2WWe3L7YALrY2NJgUDSS8MDIMH3IhNg+q6CQsCjUAObIACYYcIoQAHTUd-S7ABSf1MIw+DB6mEmn9unk-mMDsJnjC3tAYD4AJQYAB8-yIZ3hAGtkC4HgADAAk+CBjVCPgAtMSweMUJTiZDFD58QBuPBEaiYHEuJYPTnc3kAH0F-0ByCaZJooMStOQEOMsr+cwgLBgmF5PhZHK5uKWmGc7lQJCWzzc9AgAAsfqgoIiOcgoPRqGAYNQtX5-kjTuB4Zcbrd+A8ECgXm9bh9kN9fqLSeEpTAaVCYIyUMI5gjkeg0bVMbBuQTibGmvT8ImmVT8CnkMy2TBtQK+TqeTBhTHxaFJdGy6nkwqk8rVeqEVq8PzdfrlcbTearXM7aOHU6XW7jn98F7sLmYFBpCgbPAKAZkNwHgB5CgAK2QwCgzwAbvADPRUJ8-Xd+HbMSAj88DCArp8O57geR7cIiQA
5条答案
按热度按时间vlju58qv1#
您可以尝试使用Map,使用帐号作为密钥,假设它们都是唯一的。
然后你可以像这样遍历map:
并获取给定帐号的条目:
x4shl7ld2#
你只需要显式地为r声明一个类型,即使声明为any也可以
也可以为Map声明一个类型
要得到相同的结果,可以使用简单的for循环
3pvhb19x3#
lodash
groupby
很容易使用。然后只需在值上绘制一个小Map,就可以开始了。易于阅读和推理,不像reduce需要一些时间来适应。https://lodash.com/docs/4.17.15#groupBy你会得到一个像这样的对象:
如果你只需要这些值,你可以使用Object.values(res)。
获取每个值的类型并与其他值相加。
最终结果为:
egdjgwm84#
第一个问题是需要指定reduce累加器的类型(代码中的
r
)。第二个问题是最后一行:
}, {})
,它应该是}, [])
,这样你就可以用一个空数组初始化你的累加器。对于转换0 -〉primary和1 -〉secondary,我们可以使用
AccountType[AccountType.primary]
和AccountType[AccountType.secondary]
。问题是返回的值将是string类型。有关枚举转换的更多信息,请查看例如以下答案:https://stackoverflow.com/a/73325300/14072498一个直接的解决方案可以是使用
reduce
和一个单独的接口来处理结果数组,比如@boreddad420。9njqaruj5#
我刚刚在你的TS Playground上尝试了这个,似乎工作正常: