使用高阶函数的N * N大小的标识矩阵
我正在尝试使用Array.prototype
(欢迎您致电其他方法)中的方法创建n * n
标识矩阵。我可以使用fill()
创建一个n*n
矩阵,但无法在不使用if-else
的情况下将对角线元素转换为。使用高阶函数的N * N大小的标识矩阵
function matrix(n) {
var nSizeArray = Array(n).fill().map(function(elem) {
return Array(elem).fill(0).indexOf([elem][elem]=1)
})
return nSizeArray
}
matrix(5)
以上只是我希望做一些演示。我无法围绕如何使用可用的数组方法填充阵列并访问数组中的元素[i][i]
。
编辑:哦,我刚才看到你写只在Array.prototype方法不只是只是起到了 ...所以我猜你不想包括Math
功能要么?
map
的第二个参数是元素的索引,我们将用它来填充矩阵中的正确点,使用1
s。
现在,我们需要一种方法来分配1
在与i == j
每个位置和0
每隔一个位置,而无需使用明显if..else
方法。我们可以使用i == j
相当于i - j == 0
的事实。
所以,现在的任务是每一个(i,j)
与i - j == 0
到1
和i - j != 0
到0
映射。
我们这样做是使用下面这行:
return 1 - Math.min(Math.abs(i-j),1);
的Math.min(...)
确保i - j == 0
映射到0
和所有其他指数的组合被映射到1
(因为它们导致|i-j| >= 1
)。通过从1
减去这个结果,我们可以简单地翻转位并得到我们想要的结果:
function matrix(n) {
return Array(n).fill(0).map(function(elem, i) {
return Array(n).fill(0).map(function(elem2, j) {
return 1 - Math.min(Math.abs(i-j),1);
});
});
}
我在类似的东西上摸索了一些我无法解释的东西。也许你可以帮忙。为什么内在的地图不做任何事情? https://jsfiddle.net/4e7nh6vz/1/ –
derp ...算了一下...... map不修改源数组本身,它只是返回修改后的一个 –
你可以尝试使用:
function matrix(n) {
return Array(n).fill(Array(n).fill())
.map(function (xs, i) {
return xs.map(function (x, j) {
return i === j ? 1 : 0;
})
});
}
matrix(5)
如果你不这样做如果使用else(或三元操作),结果将是一个boleean矩阵。
我觉得使用'Array :: fill'是更现代化(更符合OP的原始代码)。如果您认为这太侵入,请随时回滚编辑 – Bergi
else-if绝对没有错。 – Bergi