【问题标题】:Creating multidimensional JavaScript arrays of any size创建任意大小的多维 JavaScript 数组
【发布时间】:2020-03-20 07:04:24
【问题描述】:

我原以为创建任意大小的多维 JavaScript 数组的函数会非常方便。但我还没有找到一个。所以我创建了自己的。

在这种情况下使用 array.map 会起作用吗?如果是这样,我想它看起来会不那么“合乎逻辑”。

//like the BASIC DIM :) use: var multiDimensionalArray = DIM([7,8,9])
function DIM(arrayOfDimensions) {
  let localArrayOfDimensions =  arrayOfDimensions.slice(); //must copy array as scope is global for arrayofdimentions
  let returnArray = [];
  if (localArrayOfDimensions.length === 0) {
    return undefined; //no more dimensions
  }    
  let arraySize = localArrayOfDimensions.shift(); // size of current dimension
  for (let arrayPointer = 0 ; arrayPointer < arraySize ; arrayPointer++){
    //for each array pointer in this array dimension, recusivly call DIM, and return and assign the value 
    returnArray[arrayPointer] = DIM( localArrayOfDimensions ); 
  }
  return returnArray; //return here if there are still more array dimensions
}

var test = DIM([5,3,2]); 
test[4][2][1] = 'aaaasss'; 
var t = test[4][2][1];

【问题讨论】:

  • 在这种情况下使用 array.map 可以吗?
  • 我尝试使用array.map 失败了几次。我想我对某些功能有阅读障碍,地图似乎就是其中之一。你能像这样的函数一样在递归场景中使用 array.map 吗?

标签: javascript arrays function multidimensional-array


【解决方案1】:

如果问题是如何映射每个维度中的所有元素,您可以像这样创建一个 mapArray 函数:

function mapArray(a, func) {
    if (a instanceof Array) {
        return a.map(subArray => mapArray(subArray, func))
    } else {
        return func(a)
    }
}

//create dummy [5,3,2] array
var test = JSON.parse('[[[0,0],[0,1],[0,2]],[[1,1],[1,2],[1,3]],[[2,2],[2,3],[2,4]],[[3,3],[3,4],[3,5]],[[4,4],[4,5],[4,6]]]');

var test2 = mapArray(test, item => item * 2)

console.log("initial array:");
console.log(JSON.stringify(test));
console.log("all items multiplied by 2:");
console.log(JSON.stringify(test2));

【讨论】:

  • 谢谢。根据您的示例,创建多维数组的每个示例似乎都是从手动键入整个数组开始的。我觉得这很奇怪,如果阵列是 3567 x 543 x 3 阵列怎么办?我知道 JS 无法像其他语言一样创建该数组。即使是旧的 BASICS 也有 DIM(7,67,5) 来创建一个 7 x 67 x 5 的数组。所以我创建了上面问题中显示的函数,并认为使用地图可能会更好,但我不确定如何。
  • 我想我没听懂你的第一个问题。问题不是关于如何将 map() 应用于多维数组的每个单元格吗?
  • 我本来可以更清楚的。我的意思是使用函数轻松“创建”任何大小的一个。我有一个有效的递归函数,但我还没有成功地用地图创建一个。
【解决方案2】:

这是map 的解决方案:

//with what value you want to fill your array?
const defaultCellValue = null;

//the actual function
function DIM(dims) {
	return Array.apply(null, Array(dims[0])).map(() => dims.length==1 ? defaultCellValue: DIM(dims.slice(1)))
}

//test
console.log(JSON.stringify(DIM([5,3,2])));

基本上,您创建一个长度为第一个维度的数组,然后将该数组的每个单元映射到一个递归子数组。

【讨论】:

  • 谢谢!为了清楚起见,我扩展了代码(对于我自己和其他在代码中不那么容易游泳的人)。我仍然对 Array.apply() 有困难,但他们试图在这里解释它:stackoverflow.com/questions/25512771/… function DIM(dims) { return Array.apply(null, Array(dims[0])).map(function() { if(dims.length == 1) {//最后一维元素 return defaultCellValue; } else {//递归到下一维元素 return DIM(dims.slice(1)); } } ); }
猜你喜欢
  • 1970-01-01
  • 2019-08-17
  • 2016-08-29
  • 1970-01-01
  • 1970-01-01
  • 2019-04-27
  • 1970-01-01
  • 2014-12-02
  • 2015-11-15
相关资源
最近更新 更多