TypeScript如何优雅将对象内所有数组属性原地转换为Set
TypeScript 原地将对象数组属性转为Set实现
需求说明
需要在不创建新对象的前提下,直接修改原输入对象,将对象中所有存储数组的属性值转换为去重后的Set类型。
给定输入:
const inputObject = {'a': [1, 2, 3], 'b': [2, 2, 2], 'c': [3,3,2,4]};
期望输出(原对象修改后):
{ a: Set(3) { 1, 2, 3 }, b: Set(1) { 2 }, c: Set(3) { 2, 3, 4 } }
最简实现(原地修改)
不需要逐键硬编码转换,直接遍历对象属性原地覆盖即可:
for (const key of Object.keys(inputObject)) { const currentVal = inputObject[key as keyof typeof inputObject]; // 仅对数组类型属性做转换,避免误处理其他类型值 if (Array.isArray(currentVal)) { (inputObject as Record<typeof key, Set<number>>)[key] = new Set(currentVal); } }
效果验证
执行上述代码后直接打印原对象即可得到目标结果:
console.log(inputObject); // 输出: { a: Set(3) { 1, 2, 3 }, b: Set(1) { 2 }, c: Set(3) { 3, 2, 4 } }
注:部分浏览器控制台打印数字类型Set时会按数值升序展示元素,Set实际存储顺序和原数组元素首次出现顺序一致,去重功能完全匹配需求。
可选极简写法(无类型校验)
如果你能100%确定对象内所有属性都是数组类型,可以省略类型判断,代码更短:
Object.keys(inputObject).forEach(k => (inputObject as any)[k] = new Set((inputObject as any)[k]));
注意:该写法用了
any跳过TS类型检查,且没有做数组类型判断,仅适合属性类型完全确定的场景使用。
内容的提问来源于stack exchange,提问作者Anurag A S
相关产品推荐
相关产品推荐

