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=数组长度;
而(i document.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]