MST

星途 面试题库

面试题:TypeScript类型断言与泛型结合优化复杂数据结构操作

给定一个复杂的数据结构,例如一个嵌套的对象数组,对象可能有不同的属性,其中一个属性可能是一个包含数字或字符串的数组。要求编写一个通用函数,它能遍历这个复杂结构,提取出所有数字类型的值并进行某种计算(例如求平均值)。请结合TypeScript类型断言和泛型来实现这个函数,以提升代码性能和可维护性,阐述你的实现思路并给出代码。
29.0万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 使用泛型来处理不同类型的复杂数据结构,这样函数可以适用于各种嵌套对象数组。
  2. 利用TypeScript的类型断言来在遍历过程中判断属性的类型,以便正确提取数字。
  3. 递归地遍历嵌套结构,当遇到数组属性时,继续递归处理数组中的元素。
  4. 收集所有数字类型的值,最后进行计算(这里是求平均值)。

代码实现

function extractAndCalculate<T>(data: T): number | undefined {
    let numbers: number[] = [];

    function traverse(obj: any) {
        if (Array.isArray(obj)) {
            obj.forEach((item) => traverse(item));
        } else if (typeof obj === 'object' && obj!== null) {
            for (let key in obj) {
                traverse(obj[key]);
            }
        } else if (typeof obj === 'number') {
            numbers.push(obj);
        }
    }

    traverse(data);

    if (numbers.length === 0) {
        return undefined;
    }

    return numbers.reduce((acc, num) => acc + num, 0) / numbers.length;
}

你可以这样调用这个函数:

const complexData = [
    {
        id: 1,
        name: 'test',
        values: [1, 2, 3],
        subObject: {
            subValue: 4
        }
    },
    {
        id: 2,
        name: 'test2',
        values: ['a', 5, 'b']
    }
];

const average = extractAndCalculate(complexData);
console.log(average);