【问题标题】:Javascript - Reversing every string of an arrayJavascript - 反转数组的每个字符串
【发布时间】:2020-01-07 02:05:49
【问题描述】:

我正在做一个练习,我不能使用任何类型的 Array.prototype.reverse 或 Array.prototype.join。我必须单独反转数组中的每个字符串并将它们打印在单独的行上。

这是我尝试过的:

// Create a function that reverses elements of a string

let reversedStuff = function (str) {
  let newReversed = "";
  for (let i = str.length - 1; i >= 0; i--) {
    newReversed += str[i];
  }
  return newReversed;
};


// Use the previous function to apply the reverse on each string of an array

const args = process.argv.slice(2);
let allArr = [];
let eachWord = function (args) {
  for (let y = 0; y <= args.length; y++) {
    return functionReverse(args)
  }
};
console.log(eachWord(args));

问题在于我的第一个函数。我不能悄悄地找到一种在数组的每个字符串上应用反向函数的方法,它只适用于第一个。有关如何解决此问题的任何提示?

非常感谢您!

【问题讨论】:

  • y &lt;= args.length 应该是 &lt;,然后是 allArr.push(reversedStuff(args[y]));,最后是 return allArr;

标签: javascript arrays string reverse


【解决方案1】:

您是指代码中的reverseStuff(args[y]) 而不是return functionReverse(args)?因为,第一个将为每个字符串调用 reverse 函数。第二个可能是一个错误,因为您的代码中没有名为 functionReverse 的函数。即使它存在,您所做的也是每次使用整个字符串数组调用该函数以获得数组 args 的长度。缺少的args[y] 是主要问题。在这里,您正在访问数组 args 的第 y 个索引处的值,这就是您想要做的。此外,正如@ASDFGerte 指出的那样,&lt;= 应该是&lt;,因为第一个将返回undefined

还请注意,通过上述更改,该函数将遍历数组,但由于它不返回任何内容,console.log(eachword(args)) 行将打印未定义。在这种情况下,您可以执行以下操作:

// inside the for loop in eachWord
console.log(reverseStuff(args[y]);

或者,更好的解决方案如下:

const args = process.argv.slice(2);
let allArr = [];
let eachWord = function (args, cb) {
  for (let y = 0; y < args.length; y++) {
      cb(reverseStuff(args[y]));
  }
};
let cb = function(reveredString) {
    // do what you want here
    // for example
    allArr.push(reveredString);
    // or just simply print
    console.log(reversedString);
};
eachWord(args, cb);

希望这会有所帮助!

【讨论】:

  • 第二种解决方案在cb 函数中改变了一个全局数组,这让事情变得混乱:P 我认为最好的方法是使用Array.prototype.map
  • @Nathan 你是对的,在回调中改变全局数组会让人困惑。然而,它同时也是一个更灵活的解决方案,其中 eachWord 就像一个简单的迭代器,并将任何给定的函数应用于字符串。 [].prototype.map 是您提到的最佳解决方案。
【解决方案2】:

您的第二个功能存在一些问题:

  1. 您将整个数组传递给 functionReverse 而不是元素。改为传递元素 args[y],如下所示:functionReverse(args[y])。另外,您可能打算调用reversedStuff 而不是functionReverse

  2. 循环条件应该是y &lt; args.length,因为数组是零索引的。

  3. return 语句在第一次迭代后结束 for 循环,因为 return 退出了函数。相反,您应该在函数中定义数组,然后在最后返回数组:

let eachWord = function (args) {
   let allArr = [];
   for (let y = 0; y <= args.length; y++) {
     allArr.push(reversedStuff(args[y]));
   }
   return allArr;
};
console.log(eachWord(args));

更好/更惯用的解决方案是使用Array.prototype.map 而不是循环:

let eachWord = function (args) {
   return args.map(reversedStuff);
};
console.log(eachWord(args));

map 返回一个新数组,其中每个元素都是将给定函数应用于源数组中每个元素的结果。

【讨论】:

    【解决方案3】:

    更简单的解决方案 - 使用下面的函数

        function reverseArray(arr) {
           for(let idx in arr) { 
             arr[idx] = arr[idx].split('').reverse().join('');
           }
        }
        
        const sampleArr = ['ABC', 'DEF','GHI','JKL'];
        
        console.log('Before Reverse', sampleArr);
        
        reverseArray(sampleArr);
        
        console.log('After Reverse', sampleArr);

    编辑:

    如果您不想更改现有数组,请使用以下函数

            function reverseArray(arr) {
               return arr.map(item => item.split('').reverse().join(''));
            }
            
            const sampleArr = ['ABC', 'DEF','GHI','JKL'];
            const reverseArr = reverseArray(sampleArr);
            console.log('Before Reverse', sampleArr);
            console.log('After Reverse', reverseArr);

    【讨论】:

      【解决方案4】:

      感谢大家的帮助!我最终以这样的方式结束:

      const revereString = function () {
        const args = process.argv.slice(2);
        let result = '';
        // First loop that look into each string in the array
        for (let i = 0; i < args.length; i++) {
          let str = '';
          // Second loop that look into each letters of each string, and reverse them
          for (let j = args[i].length - 1; j >= 0; j--) {
            str += args[i][j];
          }
          // Printing each reversed string on their own line, until the last string of an array.
          result += str;
          if (i !== args.length - 1) {
            result += str + '\n';
          }
      
        }
        return result;
      };
      
      console.log(revereString());
      

      我无法使用 .reverse 或 .join 进行此练习,但我仍然注意到您的建议。他们让它看起来很容易!

      【讨论】:

        猜你喜欢
        • 2020-09-04
        • 2012-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多