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

标签 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是否有某种 native 方式来做到这一点?我看了看fill ,但它似乎不是我需要的。

最佳答案

尝试使用 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]

这是一个简单的 for 循环方法,供您清楚地理解,
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

关于javascript - 如何在 JavaScript 中填写未定义的锯齿状多维数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36361919/

相关文章:

c - 稀疏多维数据表示

python - 将字典转换为方阵

javascript - 如何防止在ReactJS中双击

javascript - 为什么我不能从 async 修饰的函数中得到我的预期结果?

javascript - highcharts - 圆环图 - 内外标签

javascript - 根据数组条件过滤

objective-c - Objective-C中的快速枚举是否可以保证迭代顺序?

javascript - 为什么在删除项目时 Javascript 中的数组不调整大小?

algorithm - 表示和乘以稀疏 bool 矩阵的最快方法是什么?

javascript/jquery : how to limit input value to 2 decimals after the point