我有一种方法想要传递通用对象数组。我还想传递对象属性以进行查找。
属性名称可以更改,因此我想用传入的内容来切换描述和值。
我该怎么做,如何传入属性并从对象数组中提取其值?
通过执行以下操作,我知道属性是否存在:
console.log(obj[key].hasOwnProperty(strDisplay))
console.log(obj[key].hasOwnProperty(strValue))
public Test<T>(obj: T[], strDisplay: string, strValue: string) {
const pickList: PickListOption[] = [];
Object.keys(obj).forEach(key => {
const option: IPickListOption = {
display:obj[key].description ,
value: obj[key].value
};
pickList.push(option);
})
return pickList;
}
我希望能够返回具有显示和值的键值对的新列表'pickList'。
答案 0 :(得分:0)
您对阵列使用Object.keys
似乎有些偏离。要将数组转换为另一个数组map
是更好的选择。
关于选择两个键,您将需要strDisplay
和strValue
作为T
的值键,以便使用到对象的索引:
interface PickListOption { value: unknown, display: unknown }
function Test<T>(arr: T[], strDisplay: keyof T, strValue: keyof T) {
return arr.map((o): PickListOption => ({
display: o[strDisplay],
value: o[strValue]
}))
}
您还可以使用特殊的映射和条件类型将键限制为仅特定类型的值:
type KeysOfValueType<T, TValue> = {
[P in keyof T] : T[P] extends TValue ? P: never
}[keyof T]
interface PickListOption { value: number, display: string }
function Test<T>(arr: T[], strDisplay: KeysOfValueType<T, string>, strValue: KeysOfValueType<T, number>) {
return arr.map((o): PickListOption => ({
display: o[strDisplay] as unknown as string,
value: o[strValue] as unknown as number
}));
}