遍历包含不同长度数组的二维数组行
Iterating over rows of 2-dimensional array containing arrays of different length
我有一个函数,可以按行从二维数组中选取所有元素,returns 是一个一维数组。
该数组具有可变数量的列和行。
示例:
let arr = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]
];
Returns:
[1, 5, 9, 2, 6, 10, 3, 7, 11, 4, 8, 12]
我想出的函数:
convertList = (list) => {
let result = [];
let listTotalEntries = R.sum(R.map(R.length)(list));
let mod = R.modulo(R.__, list.length);
let counterRow = -1;
for (let i = 0; i < listTotalEntries; i++) {
if (mod(i) === 0) {
counterRow++;
}
if (list[mod(i)][counterRow]) {
result.push(list[mod(i)][counterRow]);
console.log(list[mod(i)][counterRow]);
}
}
console.log(result);
return result;
};
问题:此函数仅适用于方阵 - 我怎样才能使其适用于可变长度的包含数组?
示例:
let arr = [
[1, 2],
[],
[9, 10, 11, 12]
];
应该return:
[1, 9, 2, 10, 11, 12]
感谢您的帮助!
手筒
你试过这个简单的吗?
var singleDimensionArr = arr.reduce(function(prev,current){return prev.concat(current)});
例如
[
[1, 2],
[],
[9, 10, 11, 12]
].reduce(function(prev,current){return prev.concat(current)});
输出[1, 2, 9, 10, 11, 12]
编辑:
基于下面 OP 的输入,因为串联需要按列进行
var max = Math.max.apply(null, arr.map(function (a) { return a.length; }));
var finalArr = []; for( var i = 0; i < max; i++)
{
for( var j = 0; j < arr.length; j++)
{
arr[j][i] ? finalArr.push(arr[j][i]) : "";
}
}
console.log(arr);
我建议逐步浏览数组
var arr1 = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]],
arr2 = [[1, 2], [], [9, 10, 11, 12]];
function single(array) {
var r = [],
max = Math.max.apply(null, array.map(function (a) { return a.length; })),
i = 0, j,
l = array.length;
while (i < max) {
for (j = 0; j < l ; j++) {
i in array[j] && r.push(array[j][i]);
}
i++;
}
return r;
}
document.write('<pre>' + JSON.stringify(single(arr1), 0, 4) + '</pre>');
document.write('<pre>' + JSON.stringify(single(arr2), 0, 4) + '</pre>');
这个例子创建了一个大的稀疏数组,如果数组是正方形的话,将每个项目放在它应该属于的地方。然后它会过滤掉在没有输入项的情况下出现的空值。
let arr = [
[1, 2],
[],
[9, 10, 11, 12]
];
var out = arr.reduce(function(o,n,i,a) {
for (var j=0;j<n.length;j++){
o[a.length * j + i] = n[j];
}
return o;
},[]).filter(function(n) {
return n !== null;
});
alert(JSON.stringify(out));
你在这里有一个 ramda.js
标签。使用 Ramda,这非常简单,因为有两个函数可以提供帮助:
const convertList = compose(flatten, transpose);
convertList(arr); //=> [1, 9, 2, 10, 11, 12]
transpose
flips a matrix over its main diagonal, that is, changing rows to columns and vice versa. flatten
turns a list of lists into a plain list. So compose
这样基本上创建了 list => flatten(transpose(list))
.
的等价物
您可以在 Ramda REPL.
上看到实际效果
我有一个函数,可以按行从二维数组中选取所有元素,returns 是一个一维数组。 该数组具有可变数量的列和行。
示例:
let arr = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]
];
Returns:
[1, 5, 9, 2, 6, 10, 3, 7, 11, 4, 8, 12]
我想出的函数:
convertList = (list) => {
let result = [];
let listTotalEntries = R.sum(R.map(R.length)(list));
let mod = R.modulo(R.__, list.length);
let counterRow = -1;
for (let i = 0; i < listTotalEntries; i++) {
if (mod(i) === 0) {
counterRow++;
}
if (list[mod(i)][counterRow]) {
result.push(list[mod(i)][counterRow]);
console.log(list[mod(i)][counterRow]);
}
}
console.log(result);
return result;
};
问题:此函数仅适用于方阵 - 我怎样才能使其适用于可变长度的包含数组?
示例:
let arr = [
[1, 2],
[],
[9, 10, 11, 12]
];
应该return:
[1, 9, 2, 10, 11, 12]
感谢您的帮助!
手筒
你试过这个简单的吗?
var singleDimensionArr = arr.reduce(function(prev,current){return prev.concat(current)});
例如
[
[1, 2],
[],
[9, 10, 11, 12]
].reduce(function(prev,current){return prev.concat(current)});
输出[1, 2, 9, 10, 11, 12]
编辑:
基于下面 OP 的输入,因为串联需要按列进行
var max = Math.max.apply(null, arr.map(function (a) { return a.length; }));
var finalArr = []; for( var i = 0; i < max; i++)
{
for( var j = 0; j < arr.length; j++)
{
arr[j][i] ? finalArr.push(arr[j][i]) : "";
}
}
console.log(arr);
我建议逐步浏览数组
var arr1 = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]],
arr2 = [[1, 2], [], [9, 10, 11, 12]];
function single(array) {
var r = [],
max = Math.max.apply(null, array.map(function (a) { return a.length; })),
i = 0, j,
l = array.length;
while (i < max) {
for (j = 0; j < l ; j++) {
i in array[j] && r.push(array[j][i]);
}
i++;
}
return r;
}
document.write('<pre>' + JSON.stringify(single(arr1), 0, 4) + '</pre>');
document.write('<pre>' + JSON.stringify(single(arr2), 0, 4) + '</pre>');
这个例子创建了一个大的稀疏数组,如果数组是正方形的话,将每个项目放在它应该属于的地方。然后它会过滤掉在没有输入项的情况下出现的空值。
let arr = [
[1, 2],
[],
[9, 10, 11, 12]
];
var out = arr.reduce(function(o,n,i,a) {
for (var j=0;j<n.length;j++){
o[a.length * j + i] = n[j];
}
return o;
},[]).filter(function(n) {
return n !== null;
});
alert(JSON.stringify(out));
你在这里有一个 ramda.js
标签。使用 Ramda,这非常简单,因为有两个函数可以提供帮助:
const convertList = compose(flatten, transpose);
convertList(arr); //=> [1, 9, 2, 10, 11, 12]
transpose
flips a matrix over its main diagonal, that is, changing rows to columns and vice versa. flatten
turns a list of lists into a plain list. So compose
这样基本上创建了 list => flatten(transpose(list))
.
您可以在 Ramda REPL.
上看到实际效果