Подход для отображения списка значений с внутренним циклом без вывода нескольких значений - PullRequest
2 голосов
/ 30 апреля 2019

Я пытаюсь функционально зациклить список чисел, сравнивая каждое число со списком правил, чтобы вывести обновленный список, состоящий из чисел и строк.У меня проблемы с пониманием того, как я могу объединить 2 цикла без дублирования количества добавленных элементов (в настоящее время 1 * 3 итерации на число: /), я также получаю undefined для всех записей.

Может кто-тоукажи мне на методику, необходимую для достижения этого, результат должен быть [1, 2, 'In', 4, 'Out', 'In', 7, 8, 'In', 'Out', 11, 'In', 13, 14, 'InOut']

код:

const range = (start, end) => Array.from({ length: end }, (_, i) => i + start)
const rules = [[3, 'In'], [5, 'Out'], [15, 'InOut']]

function output(range, markers) {
  return range.map(num => {

    markers.forEach(([div, text]) => {
      if(num % div === 0) return text
      return num
    })

  })
}

output(range(1, 10), rules)

1 Ответ

2 голосов
/ 30 апреля 2019

Вы не хотите использовать forEach, так как это для выполнения функции для каждого элемента массива, например, карты, которая ничего не возвращает.

Что вы должны сделать, это найти маркер и вернуть подстановку, если найдете ее.

Вот что find сделает для вас:

const range = (start, end) => Array.from({ length: end - (start-1) }, (_, i) => i + start)
const rules = [[15, 'InOut'], [5, 'Out'], [3, 'In']]

function output(range, markers) {

 return range.map(num => {

    let item = markers.find(marker => num % marker[0] === 0);
    
    if(item){
      return item[1];
    }
    return num;
  })
}

console.log(output(range(1, 30), rules))

Кроме того, упорядочите свои правила по числу делителей, чтобы простые числа были в конце.Это потому, что find получает первый удар, поэтому вы хотите, чтобы он сначала находил числа с наибольшим делителем.

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