【问题标题】:Function that creates an array with subarries使用子数组创建数组的函数
【发布时间】:2019-03-06 13:27:04
【问题描述】:

我有一个创建子数组数组的函数。它需要三个参数:要在数组中创建的子数组数量 (numSub)、所需值在每个子数组中出现的次数 (numValue) 以及所需值 (value)。

例如,如果我要使用(3, 2, test) 调用函数,我想要以下输出:

Array [Array ["test", "test"], Array ["test", "test"], Array ["test", "test"]]

这是我写的函数:

function subarrs(numSub, numValue, value) {
  let arr = [];
  for (let i = 0; i < numSub; i++) {
    arr.push([]);
  }
  arr.forEach(function(sub) {
    sub.fill(value, 0, numValue - 1);
  });
  return arr;
}

console.log(subarrs(3, 2, 'test'));

我循环了numSub 变量,并在每次迭代时将一个数组插入arr。这是成功的。 (Array [Array [], Array [], Array []])

然后我使用forEach 循环在每个子数组中填充value,从索引0 开始,到索引numValue - 1 结束(因为该值的第二次出现实际上是在索引1 处。)

但是,该功能无法按预期工作。我收到的不是上述所需的输出,而是:

Array [Array [], Array [], Array []]

【问题讨论】:

    标签: javascript arrays for-loop foreach


    【解决方案1】:

    您可以在接收到正确长度的数组上使用fill,例如Array(numValue).fill(numValue)。你可以这样做:

    function subarrs(numSub, numValue, value) {
      return Array.from({length: numSub}, () => Array(numValue).fill(value));
    }
    
    console.log(subarrs(3, 2, 'test'));

    【讨论】:

      【解决方案2】:

      您正在填充一个空数组。它仍然是一个空数组(无需填充)。

      你应该构造一些长度的数组:

      arr.push(new Array(numValue));
      

      完成:

      function subarrs(numSub, numValue, value) {
        let arr = [];
        for (let i = 0; i < numSub; i++) {
          arr.push(new Array(numValue));
        }
        arr.forEach(function(sub) {
          sub.fill(value);
        });
        return arr;
      }
      
      console.log(subarrs(3, 2, 'test'));
      

      【讨论】:

        【解决方案3】:

        Array.fill() 只修改数组值。它不会添加新的。再次使用 push

        function subarrs(numSub, numValue, value) {
          let arr = [];
          for (let i = 0; i < numSub; i++) {
            arr.push([]);
          }
          arr.forEach(function(sub) {
              for (let j = 0; j < numValue; j++) {
                 sub.push(value);
              }
          });
          return arr;
        }
        
        console.log(subarrs(3, 2, 'test'));

        【讨论】:

          【解决方案4】:

          您可以使用 .push 方法将值添加到您的数组中,而不是 .fill,请参阅工作演示:

          function subarrs(numSub, numValue, value) {
            let arr = [];
            for (let i = 0; i < numSub; i++) {
              arr.push([]);
              for (let j = 0; j < numValue; j++) {
                arr[i].push(value);
              }
            }
            
            return arr;
          }
          
          console.log(subarrs(3, 2, 'test'));

          【讨论】:

            【解决方案5】:

            fill 仅适用于已经存在的索引,在您的情况下,它的第二个参数应该是数组的 length(这是默认值)而不是 length - 1。你可以在这里看到它:

            let myEmptyArray = [];
            let myFullArray = [1, 2, 3, 4];
            
            myEmptyArray.fill(0, 0, 4);
            myFullArray.fill(0, 0, 4);
            
            console.log(myEmptyArray, myFullArray)

            您可以使用new Array(numValue)push 一个具有必要插槽的数组。像这样的:

            function subarrs(numSub, numValue, value) {
              let arr = [];
              for (let i = 0; i < numSub; i++) {
                arr.push(new Array(numValue));
              }
              arr.forEach(function(sub) {
                sub.fill(value);
              });
              return arr;
            }
            
            console.log(subarrs(3, 2, 'test'));

            【讨论】:

              【解决方案6】:

              如果你有 es2015+ 就可以轻松搞定:

              const subarrs = (length, subLength, value) => 
                  [...Array(length)].map(() => [...Array(subLength)].fill(value));
              
              subarrs(3, 2, 'test');
              

              (已编辑)在第一条评论之后

              【讨论】:

              • 感谢@trincot 的评论!我修复了,它应该可以按预期工作
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2021-04-18
              • 2018-02-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多