Функция JavaScript Map не возвращает значение - PullRequest
0 голосов
/ 05 мая 2019

Я пытаюсь вернуть значение внутри функции карты до достижения возвращаемого по умолчанию значения в конце функции.

Я заметил, что функция карты не возвращает значение для функции validateSequence, нопростой цикл forЯ знаю, что функция map выполняется до достижения возвращаемого по умолчанию значения true, так почему же она не возвращает false?

Ответы [ 5 ]

2 голосов
/ 05 мая 2019

Здесь:

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

Вы возвращаете false из предоставленного обратного вызова (seq) => {}, а не самой функции validateSequence.Вы не можете break из map или forEach методов.Итак, цикл for является лучшим вариантом здесь.

Вы также можете проверить, присутствует ли 1014 * элемент в sequence в 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']))
0 голосов
/ 05 мая 2019

В вашей функции 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 loop.

0 голосов
/ 05 мая 2019

.map создает новый массив с результатами вызова предоставленной функции для каждого элемента в вызывающем массиве.Это не замена цикла.

Что вы на самом деле делаете, так это создаете массив логических значений, но не сохраняете его независимо.Затем он завершает эту задачу, затем returns true внизу.

Попробуйте использовать .forEach, если вы хотите перебрать массив или, возможно, .every, что упростит вашу логику:

function validateSequence(sequence) {
  const modifers = ['-', 'm', 'b', 'i'];
  return sequence.every(letter => modifers.includes(letter))
};
0 голосов
/ 05 мая 2019

Здесь есть несколько проблем:

  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;
};
0 голосов
/ 05 мая 2019

Карта возвращает false для каждого элемента в вашей переменной sequence. Поэтому, если вы вернете это, вы получите массив ложных элементов:

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 в переменной, вы можете оценить это, чтобы определить, все ли, некоторые, любые являются ложными, если вам так нравится. Это зависит от вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...