我正在尝试从功能上循环一个数字列表,对照规则列表检查每个数字,以输出由数字和字符串组成的更新列表。我在理解如何组合两个循环而又不重复添加项的数量(当前每个数字为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)
答案 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
是第一个匹配项,因此您希望它首先找到除数最大的数字。