【问题标题】:Issue while looping 2D array javascript循环二维数组javascript时出现问题
【发布时间】:2021-09-29 08:18:13
【问题描述】:

我正在尝试一个真正简单的事情,即在二维数组中循环并通过检查每行的行来创建另一个数组。

例如,我的二维数组包含来自 Google 表格的一系列单元格的十六进制颜色。我想检查每一行并验证元素 id 是红色还是橙色。

这是我的示例代码:

var 2Darray = [ [ '#ff0000', '#000000', '#000000' ],
              [ '#000000', '#ff6d01', '#000000' ],
              [ '#000000', '#000000', '#000000' ] ]
var redHex = "#ff0000";
var orangeHex = "#ff6d01";

var newColors = [];
for (var i = 0; i < rangeColor.length; i++) {
    var keepGoing  = true; 
    for (var j = 0; j < rangeColor[i].length; j++) {
        switch (rangeColor[i][j]) {
            case redHex:
                newColors[i] = redHex;
                console.log("1")
                keepGoing = false;
                break;
            case orangeHex:
                newColors[i] = orangeHex;
                console.log("2");
                keepGoing = false;
                break;
            case "#000000":
                newColors[i] = "#000000";
                console.log("3")
                keepGoing = false;
                break;
        }
        if (!keepGoing) {
          break;
        } 
    }
}    
console.log(newColors);

我的新数组应该是:[ '#ff0000', '#ff6d01', '#000000' ],但是是[ '#ff0000', '#000000', '#000000' ],这表明我的循环存在问题,但我不知道是什么问题。也许是双循环的中断行为?

【问题讨论】:

  • rangeColor.length 是什么?
  • 你指的 rangeColor 变量是什么?
  • 虽然我不确定我是否能正确理解你的脚本,但如果你的脚本中2DarrayrangeColor,那么删除case "#000000": 中的keepGoing = false; 怎么样?因为当检查数组的第二个元素时,只检查第一个元素,因为keepGoing = false;case "#000000":。如果2DarrayrangeColor,我认为通过这个修改,得到[ '#ff0000', '#ff6d01', '#000000' ]。如果我误解了你的剧本,我深表歉意。

标签: javascript arrays google-apps-script google-sheets


【解决方案1】:

虽然我不确定我是否能正确理解你的脚本,但如果2DarrayrangeColor,在你的脚本中,如何将case "#000000": 中的keepGoing = false; 删除如下?

因为当检查数组的第二个元素时,只检查第一个元素,因为keepGoing = false;case "#000000":。如果2DarrayrangeColor,我认为这可能是您的问题的原因。

而且,在您的脚本中,我认为需要添加 var newColors = [];

当你的脚本被修改后,下面的修改呢?

修改脚本:

var newColors = [];
var rangeColor = [ [ '#ff0000', '#000000', '#000000' ],
              [ '#000000', '#ff6d01', '#000000' ],
              [ '#000000', '#000000', '#000000' ] ];
var redHex = "#ff0000";
var orangeHex = "#ff6d01";
for (var i = 0; i < rangeColor.length; i++) {
    var keepGoing  = true; 
    for (var j = 0; j < rangeColor[i].length; j++) {
        switch (rangeColor[i][j]) {
            case redHex:
                newColors[i] = redHex;
                console.log("1")
                keepGoing = false;
                break;
            case orangeHex:
                newColors[i] = orangeHex;
                console.log("2");
                keepGoing = false;
                break;
            case "#000000":
                newColors[i] = "#000000";
                console.log("3")
                // keepGoing = false; // Removed
                break;
        }
        if (!keepGoing) {
          break;
        } 
    }
}    
console.log(newColors);

作为其他方法,下面的示例脚本怎么样?

示例脚本:

var rangeColor = [
  ['#ff0000', '#000000', '#000000'],
  ['#000000', '#ff6d01', '#000000'],
  ['#000000', '#000000', '#000000']
];
var redHex = "#ff0000";
var orangeHex = "#ff6d01";

var newColors = rangeColor.map(r => r.includes(redHex) ? redHex : r.includes(orangeHex) ? orangeHex : '#000000');
console.log(newColors) // ==> [ '#ff0000', '#ff6d01', '#000000' ]

参考资料:

【讨论】:

  • 谢谢,真的很喜欢你的第二种方法!我不是很习惯 js。
【解决方案2】:

我正在考虑您的问题中的一个错字,即 2Darray = rangeColor。

这是因为,你每次都在第一次迭代中打破你的内部循环。因此,您的答案是每一行的第一个元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 2020-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多