Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在包含不同长度数组的二维数组行上迭代_Javascript_Arrays_Multidimensional Array_Ramda.js - Fatal编程技术网

Javascript 在包含不同长度数组的二维数组行上迭代

Javascript 在包含不同长度数组的二维数组行上迭代,javascript,arrays,multidimensional-array,ramda.js,Javascript,Arrays,Multidimensional Array,Ramda.js,我有一个函数,它从一个二维数组中按行选取所有元素,然后返回一个一维数组。 数组的列和行数量可变 例如: 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 listTotalEntri

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

例如:

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;
};
应返回:

[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 max=Math.max.apply(null,arr.map(函数(a){returna.length;}));
var finalArr=[];对于(变量i=0;i
我建议一步一步地检查阵列

var arr1=[[1,2,3,4],[5,6,7,8],[9,10,11,12],
arr2=[[1,2],[9,10,11,12];
单功能(阵列){
var r=[],
max=Math.max.apply(null,array.map(函数(a){return a.length;})),
i=0,j,
l=数组长度;
而(idocument.write(''+JSON.stringify(single(arr2),0,4)+''此示例生成一个大的稀疏数组,将每个项放在它所属的位置(如果数组为正方形)。然后,它过滤掉没有输入项时出现的空值

让arr=[
[1, 2],
[],
[9, 10, 11, 12]
];
var out=arr.reduce(函数(o,n,i,a){

对于(var j=0;j您在这里有一个
ramda.js
标记。使用ramda,它非常简单,因为有两个函数可以帮助您:

将矩阵翻转到其主对角线上,即,将行更改为列,反之亦然。将列表列表转换为普通列表。因此,这样的调整实质上创建了等效于展平(转置(列表))


你可以在

上看到这一点,它与OP addedSorry的结果不匹配。我在返回语句中有一个输入错误,9和2翻过来,我更正了它。你的解决方案按列挑选项目-我想按行挑选项目。@Marie,因为有一个输入错误(完全改变了问题).现在你基本上与我的答案相同,但你不会返回错误的值,例如
0
@NinaScholz是的,我无法超过你对
max
的评估。如果你愿意,你可以投我一票:)谢谢-我对您的解决方案进行了优化,并检查了James的“因为它更紧凑,并且使用了reduce和filter”。@Raggamuffin,它可能看起来更紧凑,但它的性能并不一定比while循环和for循环更好。哇!工作起来很有魅力,精巧!我没有意识到Ramda中存在像transpose这样的函数-这需要一些时间以及将所有功能和相关可能性内化的经验。谢谢!是的,Ramda团队正在改进发现功能的方法。这其中的一个步骤是。太好了!书签-我期待手册/指南的进展。我已经为版本0.17找到了一个,但似乎只有介绍性章节ava我还可以。我希望他们继续写它,作为对文档的适当补充。这已经被搁置,但我们希望很快能回到它。顺便说一句,虽然它列在特定版本下,但它确实相当通用。
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);
const convertList = compose(flatten, transpose);
convertList(arr); //=> [1, 9, 2, 10, 11, 12]