MST

星途 面试题库

面试题:JavaScript迭代器在数组函数式编程中的深度应用

在JavaScript的函数式编程场景下,需要对一个多层嵌套的数组(例如[[1, 2], [3, [4, 5]], 6])进行扁平化处理,并使用迭代器和高阶函数,实现一个通用的累加器函数,该函数能在扁平化后的数组上进行任意自定义的累加操作(例如累加所有奇数元素,或者累加元素的对数等)。请详细阐述实现思路并给出完整的代码实现,同时说明这种实现方式在可维护性和扩展性方面的优势。
49.4万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 扁平化多层嵌套数组:使用迭代器(Iterator)和for...of循环来遍历多层嵌套数组,将所有元素提取到一个一维数组中。
  2. 实现通用累加器函数:通过高阶函数,将自定义的累加逻辑作为回调函数传入累加器函数,在扁平化后的数组上执行该逻辑。

代码实现

// 扁平化多层嵌套数组
function flattenArray(arr) {
    let result = [];
    for (let item of arr) {
        if (Array.isArray(item)) {
            result = result.concat(flattenArray(item));
        } else {
            result.push(item);
        }
    }
    return result;
}

// 通用累加器函数
function accumulator(arr, callback) {
    let sum = 0;
    for (let num of arr) {
        sum += callback(num);
    }
    return sum;
}

// 示例自定义累加逻辑:累加所有奇数元素
function sumOdd(num) {
    return num % 2 === 1 ? num : 0;
}

// 示例自定义累加逻辑:累加元素的对数
function sumLog(num) {
    return Math.log(num);
}

let nestedArray = [[1, 2], [3, [4, 5]], 6];
let flatArray = flattenArray(nestedArray);

// 累加奇数元素
let oddSum = accumulator(flatArray, sumOdd);
// 累加元素的对数
let logSum = accumulator(flatArray, sumLog);

console.log("扁平化数组:", flatArray);
console.log("奇数元素和:", oddSum);
console.log("元素对数和:", logSum);

可维护性和扩展性优势

  1. 可维护性
    • 代码逻辑清晰,flattenArray函数专注于扁平化数组,accumulator函数专注于执行累加操作,职责单一,易于理解和维护。
    • 自定义的累加逻辑(如sumOddsumLog)作为独立的函数,使得修改和调试特定的累加逻辑更加方便。
  2. 扩展性
    • 只需定义新的回调函数,就能轻松扩展accumulator函数的功能,实现不同的累加操作,无需修改accumulator函数本身的代码。
    • 同样,若需要改变扁平化数组的方式,只需修改flattenArray函数,而不会影响到累加操作的逻辑。