JavaScript Map函数未返回值

时间:2019-05-05 06:58:20

标签: javascript ecmascript-6

我正在尝试在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?

6 个答案:

答案 0 :(得分:2)

这里:

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

您是从false提供的回调函数返回(seq) => {},而不是validateSequence函数本身。您无法通过breakmap方法使用forEach。因此,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']))

答案 1 :(得分:0)

对于sequence变量中的每个元素,地图返回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的结果存储在一个变量中,则可以对它进行评估,以确定是否愿意,如果全部,部分或全部为假。这取决于你。

答案 2 :(得分:0)

这里有几个问题:

  1. 修饰符拼写为修饰符。
  2. 您发布的两个示例并不相同。在map()版本中,您传递的回调用于返回新值,该新值将在map()函数的返回中。当您在该回调中返回false时,您并没有从validateSequence()中退出,而是从回调中返回(这将map的返回结果中包含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;
};

答案 3 :(得分:0)

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

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

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

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

答案 4 :(得分:0)

在您的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循环。

答案 5 :(得分:0)

您可以这样做

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