如何在JavaScript中填写未定义的锯齿状多维数组?

时间:2016-04-01 17:01:18

标签: javascript arrays matrix

我的目标是转置矩阵;但是,子阵列并不都具有相同的长度。例如:[[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,但它看起来并不像我需要的。

3 个答案:

答案 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]

DEMO

答案 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>');