【问题标题】:How to iterate through each array in a Multi-Dimensional array at the same time如何同时遍历多维数组中的每个数组
【发布时间】:2017-07-23 19:06:27
【问题描述】:

假设我有一个按照以下代码的多维数组:

var theArray = [
  [1, 2, 3],
  [3, 2, 1],
  [1, 2, 3],
  [1, 2, 1]
]

我需要执行一次迭代,根据某些条件改变数字:

  • 如果数字 1 下面有一个 3;它转换为“foo”。
  • 如果数字 3 上面有一个 1;它转换为“bar”。
  • 如果出现 2 对 1 & 3 或 3 & 1 的垂直连续序列,则这些对不会发生突变。

我的问题是,当我使用 forEach() 迭代它时,我最终会在到达下一个数组之前改变当前数组中的数字,因此我使条件无效,因为一旦迭代进入下一个数组;检查失败是因为会有“foo”或“bar”而不是 1 或 2。

所以这样的事情是行不通的:

someArray.forEach((array, index) => {
  array.forEach((digit, numIndex) => {
    if(someArray[index + 1][numIndex] == 3 && digit == 1) {
      array[numIndex] = "foo"
    } else if(someArray[index - 1][numIndex] == 1 && digit == 3) {
      array[numIndex] = "bar"
    }
  })
})

因此;我认为必须有一种方法可以“实时检查”这些条件是否同时存在于所有数组中。特别是考虑到需要检查垂直对的最后一个收缩。

预期结果:

var theArray = [
  ["foo", 2, 3],
  ["bar" , 2, 1],
  [1, 2, 3]
  [1, 2, 1]
]

这是如何实现的?

提前感谢您的帮助!

【问题讨论】:

  • 不可能return 来自Array.prototype.forEach() 的值
  • 复制数组。如果这是问题,则迭代一个并改变另一个
  • @guest271314 感谢您指出这一点,我已修复它,这应该是半伪代码,仅作为示例。
  • 预期的结果数组是什么? [ [ "foo", 2, 3 ], [ 3, 2, "foo" ], [ 1, 2, 3 ], [ 1, 2, 1 ] ]?
  • 感谢您的回复,我已经添加了预期的结果@guest271314

标签: javascript arrays algorithm multidimensional-array


【解决方案1】:

首先检查数组的元素是否存在于+/-索引处,然后使用.every()检查该索引处的所有元素是否仅包含13

var theArray = [
  [1, 2, 3],
  [3, 2, 1],
  [1, 2, 3],
  [1, 2, 1]
];

var not = [1,3,1,3];

theArray.forEach((array, index) => {
  array.forEach((digit, numIndex) => {
    if(theArray[index +1] && theArray[index + 1][numIndex] 
      && theArray[index + 1][numIndex]  == 3 && digit == 1 
      && !theArray.map(arr => arr[index +1])
         .every((el, i) => el === not[i]) && !theArray.map(arr => arr[index +1])
         .every((el, i) => el === not.slice(0).reverse()[i])) {
      array[numIndex] = "foo"
    } 
    else if(theArray[index - 1] && theArray[index - 1][numIndex] 
         && theArray[index -1][numIndex] == "foo" && digit == 3) {
      if (!theArray.map(arr => arr[index -1])
         .every((el, i) => el === not[i]) && !theArray.map(arr => arr[index -1])
         .every((el, i) => el === not.slice(0).reverse()[i]))
      array[numIndex] = "bar"
    }
  })
});

console.log(theArray);

【讨论】:

  • 感谢您的回答;这正是我想要的,但只是为了清楚起见;您使用 .every() 检查该索引处的元素是否只有 1 或 3,这是检查连续垂直对吗? @guest271314
  • 我刚刚在控制台中尝试过,不幸的是这不会检查连续对,它会检查该索引处的所有元素是 1 还是 3,但我需要这个来检查它们是否是一对!!
  • @hyper0009 好点。您可以定义一个数组,其中包含theArray 在该特定索引处不应包含的元素,检查当前元素是否设置为theArray 正向或反向。查看更新后的帖子
  • 感谢更新,这正是我想要的;我可以创建不同的数组来交叉检查不同序列的矩阵。 @guest271314
猜你喜欢
  • 2013-03-25
  • 1970-01-01
  • 2012-04-16
  • 2014-10-03
  • 2015-09-26
相关资源
最近更新 更多