使用内部循环映射值列表而不输出多个值的方法



我正在尝试在功能上循环一个数字列表,根据规则列表检查每个数字,以输出由数字和字符串组成的更新列表。我无法理解如何在不重复添加的项目数量的情况下组合 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)

你不想使用 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受到第一次命中,因此您希望它首先找到除数最多的数字。

最新更新