【问题标题】:Map function not returning a value映射函数不返回值
【发布时间】:2020-08-08 01:40:20
【问题描述】:

我试图在 map 函数中返回一个值,然后在函数末尾达到默认返回值。

我注意到 map 函数没有返回 validateSequence 函数的值,但是一个简单的 for 循环可以。

function validateSequence(sequence) {

  const modifers = ['-', 'm', 'b', 'i'];

  sequence.map((seq) => {
    if(!modifers.includes(seq)) {
      return false; // want to return false
    };
  });

  return true;
};


validateSequence(['Z','e','p']); // returns true
function validateSequence(sequence) {

  const modifers = ['-', 'm', 'b', 'i'];

  for(let i=0; i<sequence.length; i++) {
    if(!modifers.includes(sequence[i])) {
      return false;
    };
  };

  return true;
};


validateSequence(['Z','e','p']); // returns false

我希望 map 函数在达到默认返回值 true 之前返回 false。我知道map函数是在达到默认返回值true之前执行的,那为什么不返回false呢?

【问题讨论】:

  • map 函数正在返回一些东西,但你没有对它做任何事情。
  • map 遍历数组中的每个项目,并从回调构建一个新的返回值数组(在您的情况下,为 false 和 undefined。除非回调抛出错误,否则它不会提前停止。它不是适合这项工作的工具;只需使用 for 循环即可。

标签: javascript ecmascript-6


【解决方案1】:

这里:

sequence.map((seq) => {
  if (!modifers.includes(seq)) {
    return false; 
  };
});

您从(seq) =&gt; {} 提供的回调返回false,而不是validateSequence 函数本身。您不能从mapforEach 方法中break。所以,for 循环在这里是一个更好的选择。

您还可以像这样检查sequence 中的every 项目是否存在于modifers 中:

function validateSequence(sequence) {
  const modifers = ['-', 'm', 'b', 'i'];
  return sequence.every(letter => modifers.includes(letter))
};

console.log(validateSequence(['Z','e','p']))
console.log(validateSequence(['m', 'i']))

【讨论】:

    【解决方案2】:

    这里有几个问题:

    1. 修饰符拼错为修饰符。
    2. 您发布的两个示例不一样。在map() 版本中,您传入的回调用于返回一个新值,该值将在map() 函数的返回中。当您在该回调中返回 false 时,您不是从 validateSequence() 返回,而是从回调中返回(这会将 false 放入 map 的返回结果中)。

    您可以在下面看到:

    function validateSequence(sequence) {
    
      const modifers = ['-', 'm', 'b', 'i'];
    
      const test = sequence.map((seq) => {
        if(!modifers.includes(seq)) {
          return false; // want to return false
        };
      });
    
      console.log(test); // [false, false, false], this is where your return false is going.
    
      return true;
    };
    

    【讨论】:

      【解决方案3】:

      对于 sequence 变量中的每个元素,Map 返回 false。所以如果你返回它,你最终会得到一个假元素数组:

      function validateSequence(sequence) {
        const modifers = ['-', 'm', 'b', 'i'];
        return sequence.map((seq) => {
          if(!modifers.includes(seq)) {
            return false; // want to return false
          };
        });
      };
      

      然后调用validateSequence(['Z','e','p']) 将导致[false, false, false]

      当然,如果你将 map 的结果存储在一个变量中,你可以评估它,以确定如果你愿意的话,all、some、any 是否为假。这取决于你。

      【讨论】:

        【解决方案4】:

        .map 使用对调用数组中的每个元素调用提供的函数的结果创建一个新数组。它不能替代循环。

        您实际上在做的是创建一个布尔数组,但无论如何都不存储它。然后它完成该任务,然后在底部returns true

        尝试使用.forEach,如果您希望遍历数组或使用.every,这将简化您的逻辑:

        function validateSequence(sequence) {
          const modifers = ['-', 'm', 'b', 'i'];
          return sequence.every(letter => modifers.includes(letter))
        };
        

        【讨论】:

          【解决方案5】:

          在你最后的validateSequence 函数中你有return true 这就是为什么你总是得到true。如果要返回map 的结果,请添加return

          return sequence.map((seq) => {
              if(!modifers.includes(seq)) {
                return false; // want to return false
              } else {
                return true;
              }  
           });
          

          我不确定您想要什么结果,但是如果您想在某些条件通过时中断循环,那么这将无法达到您的目的,因为map 总是返回一个值,它是一对一的映射。如果你想打破一个循环,你简单的for循环。

          【讨论】:

            【解决方案6】:

            你可以这样做

            function validateSequence(sequence) {
            
                const modifers = ['-', 'm', 'b', 'i'];
            
                const isMatch = sequence.some(seq => {
                    return modifers.includes(seq)
                })
            
                return isMatch
            }
            console.log(validateSequence(['Z', 'e', 'p']))
            

            【讨论】:

              猜你喜欢
              • 2018-06-29
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-10-22
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多