【问题标题】:JavaScript nested loop not working as expectedJavaScript 嵌套循环未按预期工作
【发布时间】:2019-10-23 02:30:40
【问题描述】:

我正在尝试使用嵌套循环更改多维数组(三个级别)的特定位置的值,但我似乎无法让它按预期工作。

正如您将在下面的代码中看到的,我的数组以三个数组开头,这三个数组中的每一个都有两个数组。我要做的是更改每个“更深”数组的第二个值,但新值会有所不同,具体取决于哪个中级数组拥有更深的数组。

数组是这样开始的:

[[['A','X'],['B','X']],
 [['C','X'],['D','X']],
 [['E','X'],['F','X']]]

我正在尝试更改“X”。前两个 exe 在同一个数组数组中,因此它们将获得相同的输出 - 依此类推。这是期望的结果:

[[['A','Output 1'],['B','Output 1']],
 [['C','Output 2'],['D','Output 2']],
 [['E','Output 3'],['F','Output 3']]]

这是我目前所拥有的:

var myArray = [
  [
    ['A', 'X'],
    ['B', 'X']
  ],
  [
    ['C', 'X'],
    ['D', 'X']
  ],
  [
    ['E', 'X'],
    ['F', 'X']
  ]
];
var firstOutput = 1;

for (i = 0; i < 3; i++) {
  for (j = 0; j < 2; j++) {
    myArray[i][j][1] = 'Output ' + firstOutput;
  }
  firstOutput = firstOutput + 1;
}

console.log(myArray);

但是,我实际上得到的是这样的,而不是得到想要的结果:

[[['A','Output 3'],['B','Output 3']],
 [['C','Output 3'],['D','Output 3']],
 [['E','Output 3'],['F','Output 3']]]

所以不是为第一个数组获取输出 1,第二个为输出 2,第三个为 3,我每次都得到输出 3。

如果有人能帮助我获得我正在寻找的结果,我将不胜感激。

【问题讨论】:

  • 尝试运行你发布的代码;它会做你想做的事,但它不会做你说它做的事。
  • 奇怪的是,虽然当我尝试使用上面发布的确切数组作为示例运行代码时,我很惊讶地看到你是对的,但当我使用实际数组运行相同的代码时,我我正在工作(具有相同的结构),它似乎不起作用......这是实际的数组:[[[Pessoa física,X],[Pessoa jurídica,X]],[[Pessoa física, X], [Pessoa jurídica, X]], [[Pessoa física, X], [Pessoa jurídica, X]]]
  • 那不是有效的 JavaScript。请确保您的minimal reproducible example 尽可能正确,并重现您的错误。如果我想象你在那里有正确的 JavaScript 语法,我会担心你没有三个不同的子数组,而是对同一个子数组的三个引用。这个问题的关键不是数组具体是什么,而是数组是如何创建的;您应该显示该代码(尽管几乎可以肯定有人会为此找到重复项,因为这是一个常见错误)。
  • 这就是交易。如果我复制并粘贴我刚刚告诉您的那一行是实际的数组并将其保存为变量,则代码有效。但是,它仍然不能在实际数组上工作(它是通过从谷歌表单获取数据创建的)。然而,我的印象是,数组中值的来源并不重要......嗯......努力找出问题可能是什么。
  • 看看let a = [1, 2]; let b = [a, a, a]; b[0][0] = 7; console.log(JSON.stringify(b))let b = [[1, 2], [1, 2], [1, 2]]; b[0][0] = 7; console.log(JSON.stringify(b))的区别。第一个中的b 以三个对[1, 2] 的引用开头;第二个有[1, 2] 的三个副本。它们可能看起来相同,但在结构上却大不相同。

标签: javascript arrays nested-loops


【解决方案1】:

试试这个:

var myArray = [
  [
    ['A', 'X'],
    ['B', 'X']
  ],
  [
    ['C', 'X'],
    ['D', 'X']
  ],
  [
    ['E', 'X'],
    ['F', 'X']
  ]
];

let itemIndex = 1;
var newArray = [];
myArray.map((item) => {
	var arr = [];
	item.map((elem) => {
    elem[1] = 'Output ' + itemIndex;
    arr.push(elem);
  });
  newArray.push(arr);
 	itemIndex = itemIndex + 1;
});

console.log(newArray);

【讨论】:

  • 虽然问题实际上是我的原始数组是通过引用而不是以前数组的真实 副本 创建的,但这个答案似乎比一个我使用的嵌套 for 循环。谢谢!
【解决方案2】:

这是我为每个人所做的:

  var arr = [
    [["A", "X"], ["B", "X"]],
    [["C", "X"], ["D", "X"]],
    [["E", "X"], ["F", "X"]]
  ];
  var count = 1
  var newArray = []
  arr.forEach(array => {
    var a = []
    array.forEach(arr => {
      arr[1] = "Output " + count
      a.push(arr)
    })
    count++
    newArray.push(a)
  })
  console.log(newArray)

【讨论】:

    猜你喜欢
    • 2020-11-05
    • 1970-01-01
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    • 2021-04-13
    相关资源
    最近更新 更多