访问 Array.map() 中的上一个父值

Access previous parent value in 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() 不会实时就地改变源数组,而是 returns 新数组 一旦完成循环遍历源数组,实际上就没有访问 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%;}