访问 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%;}
我正在尝试使用 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%;}