【问题标题】:Grabbing String From Nested Array Using Nested Loops使用嵌套循环从嵌套数组中获取字符串
【发布时间】:2021-01-16 20:24:51
【问题描述】:

我对编码完全陌生,我正在练习循环和数组。我创建了一个包含多个包含字符串对的子数组的数组。我正在尝试使用嵌套的 for 循环拉出并隔离每个字符串。 这是我的代码:

const pairs = [['Blue', 'Green'],['Red', 'Orange'],['Pink', 'Purple']];

//attempting to use nested arrays to get each string from an array 
function getString(arr){
    //this loop should grab each array in the list of arrays
    for (let i = 0; i < arr.length; i++){
        console.log(i , arr[i]);
        //this should assign each sub array to a new var to be iterated over
        subArr = arr[i];
    } for (let j = 0; j < subArr.length; j++){
        console.log(j, arr[j]);
    }
};


console.log(getString(pairs)); 

问题是最后一个 for 循环的输出是:['Pink', 'Purple'] 不是从嵌套循环中提取的每种颜色。

我在这里做错了什么?

  • 美里

【问题讨论】:

  • 你期望的输出是什么?
  • 您想返回数组结果还是只想将它们显示到控制台?
  • 你有嵌套数组。当您使用第一个 for 循环时,您只是在访问内部数组。你需要再循环一次来读取这个数组的值。
  • 我正在尝试提取每个字符串并将它们放入一个新数组中并打印出来

标签: javascript arrays nested-for-loop


【解决方案1】:

您应该像这样嵌套for 循环:

for (let i = 0; i < arr.length; i++) {
  console.log(i, arr[i]);
  //this should assign each sub array to a new var to be iterated over
  subArr = arr[i];

  for (let j = 0; j < subArr.length; j++) {
    console.log(j, arr[j]);
  }
}

你如何拥有它,他们会一个接一个地运行。

【讨论】:

    【解决方案2】:

    提供解决方案

    function getString(arr) {
      let arrResult = [];
    
      for (let i = 0; i < arr.length; i++) {
        for (let j = 0; j < arr[i].length; j++) {
          arrResult.push(arr[i][j]);
        }
      }
    
      return arrResult;
    }
    

    【讨论】:

      【解决方案3】:

      您需要嵌套循环,就像嵌套数组一样。另外,除非您想更改ij,否则我建议您使用.forEach,因为它更易于使用。

      例子:

      pairs.forEach((pair, i) => {
        pair.forEach((subPair, j) => {
          console.log(j, subPair);
        });
      });
      

      您也可以创建一个变量,在 pair.forEach 函数中推送到它,然后在根函数的末尾返回它。

      我希望这能回答您的问题,感谢您的发帖,祝您有愉快的一天。 ;P

      【讨论】:

        【解决方案4】:

        您的循环实际上并没有嵌套:您在开始第二个循环之前关闭了第一个循环。因为subArr 是一个全局变量(没有letconstvar 关键字),它仍然在第二个循环中定义,但这不是一种理想的处理方式。您还需要记录 arr[i][j] 而不是您拥有的。

        这解决了这些问题:

        function getString(arr) {
          //this loop should grab each array in the list of arrays
          for (let i = 0; i < arr.length; i++){
            //this should assign each sub array to a new var to be iterated over
            let subArr = arr[i];
            for (let j = 0; j < subArr.length; j++){
              console.log(arr[i][j]);
            }
          }
        };
        getString(pairs);
        

        您遇到的另一个问题是您正在调用console.log(getString(pairs)),但getString 没有返回任何内容,它正在记录自己。例如,如果您希望它返回所有项目的换行符分隔的字符串,您可以将项目推送到数组并返回它们与换行符(或任何您想要的字符)连接:

        function getString(arr) {
          let ret = []
          //this loop should grab each array in the list of arrays
          for (let i = 0; i < arr.length; i++){
            //this should assign each sub array to a new var to be iterated over
            let subArr = arr[i];
            for (let j = 0; j < subArr.length; j++){
              ret.push(arr[i][j]);
            }
          }
          return ret.join('\n')
        };
        
        console.log(getString(pairs));
        

        嵌套循环本身并不理想,因为它们的可读性不如使用数组方法。使用forEach 需要更少的代码:

        function getString (arr) {
          arr.forEach(function (subArr) {
            console.log(subArr[0])
            console.log(subArr[1])
          })
        }
        
        getString(pairs)
        

        或者,更简洁,您可以使用map

        function getString (arr) {
          return arr.map(([ a, b ]) => `${a}\n${b}`).join('\n');
        }
        console.log(getString(pairs))
        

        更简洁地说,您可以使用[].flat()

        const getString = (xs = []) => xs.flat().join('\n')
        console.log(getString(pairs))
        

        【讨论】:

        • 哇,感谢您的洞察力!我知道这是我写它们的方式。我查了地图,我还在想如何使用它们,它们上面的 MDN 参考有点行话哈哈!
        猜你喜欢
        • 2015-04-12
        • 2016-01-20
        • 2021-11-24
        • 1970-01-01
        • 1970-01-01
        • 2015-05-02
        • 1970-01-01
        • 2013-04-05
        • 1970-01-01
        相关资源
        最近更新 更多