我的目标是转置矩阵;但是,子阵列并不都具有相同的长度。例如:[[1,2,3], [4,5], [0,-1,0,0]]
。我无法转换这个因为指数不匹配。我需要的是:
[[1,2,3,undefined],
[4,5,undefined,undefined],
[0,-1,0,0]]
这样,较短的行都与最长的行匹配相同的长度,但在扩展的插槽中填充undefined
。
我很清楚我可以通过可能被认为更慢或更粗糙的方式来做到这一点,即通过初始化和清空数组和复制,或者查找undefined
的数组。 javascript是否有某种本地方式来做到这一点?我看了fill,但它看起来并不像我需要的。
答案 0 :(得分:2)
尝试使用数组的length
属性
var arr = [[1,2,3], [4,5], [0,-1,0,0]];
//getting the max length among the sub arrays.
var max = arr.reduce(function(a,b){ return Math.max(a, b.length) }, 0);
//setting the max length to all the sub arrays.
arr = arr.map(function(itm){ return (itm.length = max, itm) });
console.log(arr[0]); //[1, 2, 3, undefined × 1]
console.log(arr[1]); //[4, 5, undefined × 2]
console.log(arr[2]); //[0, -1, 0, 0]
好的,这是上述代码的正常版本,
var arr = [
[1, 2, 3],
[4, 5],
[0, -1, 0, 0]
];
//getting the max length among the sub arrays.
var max = arr.reduce(function(a, b) {
return Math.max(a, b.length)
}, 0);
//setting the max length to all the sub arrays.
arr = arr.map(function(itm) {
itm.length = max;
return itm
});
console.log(arr[0]); //[1, 2, 3, undefined × 1]
console.log(arr[1]); //[4, 5, undefined × 2]
console.log(arr[2]); //[0, -1, 0, 0]
这是一个简单的旧循环方法,以便您清楚地理解,
var arr = [[1, 2, 3],[4, 5],[0, -1, 0, 0]];
var max = 0;
for(var i=0;i<arr.length;i++) {
max = Math.max(max, arr[i].length);
}
for(var i=0;i<arr.length;i++) {
arr[i].length = max
}
console.log(arr[0]); //[1, 2, 3, undefined × 1]
console.log(arr[1]); //[4, 5, undefined × 2]
console.log(arr[2]); //[0, -1, 0, 0]
答案 1 :(得分:2)
Array.reduce
功能是一件好事。但在这种情况下,Array.forEach
会更快。此外,数组length
是动态属性,无需使用Array.map
:
var arr = [[1,2,3], [4,5], [0,-1,0,0]],
max = 0;
arr.forEach(function(v){ if (v.length > max) max = v.length; });
arr.forEach(function(v){ v.length = max; });
答案 2 :(得分:1)
this
的版本。现在使用真实的undefined
,而不是稀疏的洞。
var arr = [[1, 2, 3], [4, 5], [0, -1, 0, 0]];
arr.forEach(function (item) {
var i = item.length;
while (i < this) {
item[i++] = undefined;
}
}, arr.reduce(function (a, b) {
return Math.max(a, b.length);
}, 0));
arr[1].forEach(function (a, i) {
document.write(i + ': ' + a + '<br>');
});
document.write('<pre>' + JSON.stringify(arr, 0, 4) + '</pre>');