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

时间:2019-04-30 11:09:53

标签: javascript arrays functional-programming

我正在尝试从功能上循环一个数字列表,对照规则列表检查每个数字,以输出由数字和字符串组成的更新列表。我在理解如何组合两个循环而又不重复添加项的数量(当前每个数字为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 个答案:

答案 0 :(得分:2)

您不想使用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是第一个匹配项,因此您希望它首先找到除数最大的数字。