在 Array.map() 中访问之前的父值

问题描述

我正在尝试使用 Array.map() 函数在 javascript 中创建一个函数来创建帕斯卡三角形。

实际上,我正在使用此功能

let triangle = [],maxRows = 5
    
// Columns
for (let i = 0; i < maxRows; i++) {
  // Create new row
  let row = [];

  // Fill row
  for (let j = 0; j <= i; j++) {
    row.push(j === 0 || j === i ? 1 : triangle[i - 1][j - 1] + triangle[i - 1][j]);
  }

  // Add row to triangle
  triangle.push(row);
}

console.log(triangle)

但我想使用这样的东西:

let triangle = Array(maxRows).fill().map((row,i) => {
  return Array(i + 1).fill().map((_,j) => {
    return j === 0 || j === i ? 1 : triangle[i - 1][j - 1] + triangle[i - 1][j];
  });
});

有没有办法访问第二个 Array.map() 中的三角形变量?

解决方法

由于 Array.prototype.map() 不会实时就地改变源数组,而是在完成对源数组的循环后返回新数组,实际上没有访问 triangle 的意义——它仍然是一个包含 5 个项目的稀缺数组:[,](由 Array().fill() 返回),直到 .map() 循环结束。

为了解决这个问题,您可以使用递归方法,或者使用 Array.prototype.reduce()

const maxRows = 5,triangle = Array(maxRows)
        .fill()
        .reduce((acc,_,i) => {
          const rowData = Array(i+1)
                  .fill()
                  .map((__,j) => 
                    !j || j == i
                      ? 1
                      : acc[i-1][j-1] + acc[i-1][j]
                  )
          acc.push(rowData)
          return acc
        },[])
      
triangle.forEach(row => console.log(JSON.stringify(row)))
.as-console-wrapper{min-height:100%;}