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

标签 javascript ecmascript-6 pascals-triangle

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

实际上,我正在使用这个功能:

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() 中访问三 Angular 形变量?

最佳答案

由于 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%;}

关于javascript - 在 Array.map() 中访问之前的父值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65438893/

相关文章:

javascript - 递归使用 jQuery 选择器?

javascript - promise 重试模式内存占用

javascript - 在 Vue 中处理 <picture> srcset 属性的正确方法

javascript - Google Maps Javascript API v3 - 如何显示公司的完整信息框

javascript - 参数未知时的 Cypher MATCH 请求

javascript - 在 JS 对象中递归和异步转换 DocumentReference

c++ - Pascal 的三角形主要使用 C++ 中的函数

javascript - 使用异步方法循环遍历数组仅采用 Angular 2 (ecma6) 中的最后一个元素

java - 如何将其变成帕斯卡三角形而不是直角三角形?

go - 使用 big.Int int 编写 Pascal 的三角形