2

我有一个函数,它按行从二维数组中选择所有元素并返回一个一维数组。该数组具有可变数量的列和行。

例子:

let arr = [
    [1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12]
];

回报:

[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]
];

应该返回:

[1, 9, 2, 10, 11, 12]

谢谢你的帮助!

莫夫

4

4 回答 4

2

你试过这个简单的吗?

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);
于 2016-03-21T12:18:43.297 回答
2

我建议逐步浏览数组

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

于 2016-03-21T12:31:13.350 回答
2

你在这里有一个ramda.js标签。使用 Ramda,这非常简单,因为有两个函数会有所帮助:

const convertList = compose(flatten, transpose);
convertList(arr); //=> [1, 9, 2, 10, 11, 12]

transpose将矩阵翻转到其主对角线上,即将行更改为列,反之亦然。 flatten将列表列表转换为普通列表。所以compose像这样的 ing 本质上创建了list => flatten(transpose(list)).

您可以在Ramda REPL上看到这一点。

于 2016-03-21T19:10:18.117 回答
1

这个例子创建了一个大的稀疏数组,如果数组是方形的,则将每个项目放在它所属的位置。然后它过滤掉在不存在输入项的情况下出现的空值。

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));

于 2016-03-21T12:50:05.277 回答