遍历包含不同长度数组的二维数组行

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.

上看到实际效果