学习一下Array.reduce函数的使用
今天面试遇到一个问题,如下:
实现一个函数,把 [{ name: "Alice", age: 10 }, { name: "Bob", age: 20 }] 转换成 { Alice: 10, Bob: 20 }
然后我用for循环加Object.values的方法实现了,面试这时候问,能不能用reduce实现?答,当然是可以的,可惜我对reduce使用的并不熟练,现在来学习一下。
下面是MDN给出的定义:
reduce方法对数组中的每个元素按按顺序执行一个提供的reducer函数,每一次运行reducer函数会将先前元素的计算结果作为参数传入,最后将其结果汇总为单个元素返回。
它的第一个参数是一个函数,第二个参数是初始值。如果不传入第二个参数,那么数组索引为0的元素将被作为初始值,迭代器将从第二个元素开始执行。
reducer可以理解为“归约”:在计算机科学和编程中,特别是在函数式编程里,reducer 是一种特定类型的函数,它用于将集合中的元素通过某种操作累积起来得到一个单一的结果。这个过程通常称为“归约”(reduce)
下面是面试题的答案
function transformArrayToObject(arr) { return arr.reduce((accumulator, currentValue) => { // 使用当前元素的name作为键,age作为值添加到累加器对象中 accumulator[currentValue.name] = currentValue.age; return accumulator; }, {}); // 初始值为一个空对象 } // 测试数据 const array = [ { name: "Alice", age: 10 }, { name: "Bob", age: 20 } ]; // 调用函数并打印结果 const result = transformArrayToObject(array); console.log(result); // 输出: { Alice: 10, Bob: 20 }
使用场景1:数组求和
const array1 = [1, 2, 3, 4]; // 0 + 1 + 2 + 3 + 4 const initialValue = 0; const sumWithInitial = array1.reduce( (accumulator, currentValue) => accumulator + currentValue, initialValue, ); console.log(sumWithInitial); // Expected output: 10
使用场景2:展开嵌套数组
const flattened = [[1, 2], [3, 4], [5, 6]].reduce((accumulator, currentValue) => accumulator.concat(currentValue), [])