Javascript 映射函数不返回值

Javascript 映射函数不返回值,javascript,ecmascript-6,Javascript,Ecmascript 6,我尝试在map函数中返回一个值,然后在函数末尾达到默认返回值 我注意到map函数没有返回validateSequence函数的值,但是一个简单的for循环可以 function validateSequence(sequence) { const modifers = ['-', 'm', 'b', 'i']; sequence.map((seq) => { if(!modifers.includes(seq)) { return false; // wan

我尝试在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
函数验证序列(序列){
常量修改器=['-','m','b','i'];

for(设i=0;iMap返回false,对于
序列
变量中的每个元素。因此,如果您返回该值,您将得到一个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是否为false。这取决于您。

这里:

sequence.map((seq) => {
  if (!modifers.includes(seq)) {
    return false; 
  };
});
您从
(seq)=>{}
提供的回调返回
false
,而不是
validateSequence
函数本身。您不能从
map
forEach
方法中
中断
。因此,
for
循环是一个更好的选择

您还可以检查
序列中的项目是否存在于
修改器中,如下所示:

函数验证序列(序列){
常量修改器=['-','m','b','i'];
返回序列.every(字母=>modifiers.includes(字母))
};
log(validateSequence(['Z','e','p']))

log(validateSequence(['m','i'])
这里有几个问题:

  • 修饰符拼写错误为Modifier
  • 您发布的两个示例不一样。在
    map()
    版本中,您传入的回调用于返回一个新值,该值将在
    map()
    函数的返回中出现。当您在该回调中返回false时,您不会退出
    validateSequence()
    ,您将从回调中返回(这会使
    映射的返回结果为false)
  • 您可以在下面看到:

    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;
    };
    

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

    实际上,您所做的是创建一个布尔值数组,但不存储它。因此,它会完成该任务,然后
    在底部返回true

    如果希望在数组上迭代,请尝试使用
    .forEach
    ,或者使用
    .every
    ,这将简化逻辑:

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

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

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

    我不确定你想要的结果是什么,但是如果你想在某些条件通过时打破循环,那么这将不符合你的目的,因为
    map
    总是返回一个值,它是一个一对一的映射。如果你想打破循环,你只需对
    循环执行

    你可以这样做

    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']))
    

    map函数正在返回seomething,但您没有对它执行任何操作。map迭代数组中的每个项,并从回调中生成一个新的返回值数组(在您的情况下,为false且未定义。除非回调抛出错误,否则它不会提前停止。它不是作业的正确工具;只需使用for循环即可。
    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']))