鲁斯前端布鲁斯前端

文章中英模式

布鲁斯前端JS面试题目 - 实现扁平化数组或对象

学习如何实现扁平化数组与对象,掌握递归与迭代的处理方式,提升前端面试竞争力。

影片縮圖

懒得看文章?那就来看视频吧

什么是数组/对象扁平化?

扁平化是指将多层嵌套的数据结构转换为单层结构的过程。在前端开发中,常见于处理API返回的嵌套JSON数据或处理复杂的树状结构。

  • 1. 数组扁平化:将多维数组转为一维数组
  • 2. 对象扁平化:将嵌套对象转为单层键值对

这类题目考察的是对递归、迭代的理解,以及如何处理复杂数据结构。

1. 实现数组扁平化

数组扁平化可以通过递归或迭代方式实现,面试中通常需要你手写实现方法,而不是直接使用 Array.flat()

方法一:递归方式

function flattenArray(arr) {
  let result = [];
  
  arr.forEach(item => {
    if (Array.isArray(item)) {
      // 将递归结果合并到当前数组
      result = result.concat(flattenArray(item));
    } else {
      result.push(item);
    }
  });
  
  return result;
}

// 示例
const nestedArray = [1, [2, 3], [4, [5, 6]]];
console.log(flattenArray(nestedArray)); // [1, 2, 3, 4, 5, 6]

2. 实现对象扁平化

对象扁平化将嵌套对象转换为单层对象,通常使用点符号表示层级。

function flattenObject(obj, prefix = '') {
  let result = {};
  
  for (const key in obj) {
    if (obj.hasOwnProperty(key)) {
      const newKey = prefix ? `${prefix}.${key}` : key;
      
      if (typeof obj[key] === 'object' && obj[key] !== null && !Array.isArray(obj[key])) {
        // 嵌套对象,递归处理
        Object.assign(result, flattenObject(obj[key], newKey));
      } else {
        // 基本类型值或数组,直接赋值
        result[newKey] = obj[key];
      }
    }
  }
  
  return result;
}

// 示例
const nestedObject = {
  a: 1,
  b: {
    c: 2,
    d: {
      e: 3
    }
  },
  f: 4
};

console.log(flattenObject(nestedObject));
/*
输出:
{
  'a': 1,
  'b.c': 2,
  'b.d.e': 3,
  'f': 4
}
*/