网站搜索

javascript - 使用 reduce 来组合累积字符串数组


我想针对给定的数字返回类似这样的内容 ['4', '42','420']:420

我正在使用 reduce 来累加数字,并使用索引将前面的数字连接起来。前两次迭代工作正常,但在第三次迭代时,我不知道如何处理结果,因为它是 undefined => [ '4', '42', '4,42undefined' ]

有什么想法吗?

function createArrayOfTiers(num) {
  const onArray = String(num).split('') 
  onArray.reduce((acc, curr, index) => {
    if (!index) return curr
    const newAcc = [...acc, acc + curr[index -1]]
    
    return newAcc
  },[])

}
createArrayOfTiers(420)

答案#1

如果你想收集一个数字的增量数字,我认为更清晰的方法是使用 .map(或 Array.from):在每次迭代中,从索引 0 到当前索引切片(字符串化的)数字。

function createArrayOfTiers(num) {
  const strNum = String(num);
  return [...strNum].map((_, i) => strNum.slice(0, i + 1));
}
console.log(createArrayOfTiers(420));

要修复你现有的代码,你需要访问累加器的前一个元素,而不是curr的前一个元素(这实际上没有意义),将其乘以10,然后加上正在迭代的数字。同时确保返回构建好的数组:

function createArrayOfTiers(num) {
  const onArray = String(num).split('')
  return onArray.reduce((acc, curr, index) => {
    if (!index) return Number(curr);
    return [...acc, acc[index - 1] * 10 + Number(curr)];
  }, [])
}
console.log(createArrayOfTiers(420));

答案#2

你出现错误是因为在第三次迭代时忘记取第一个数字。你使用了acc + curr[index - 1],但忘记了acc + curr[index - 2]。

要修复它,你可以把数字从第一个到当前的切片,然后再把它们连接起来。

function createArrayOfTiers(num) {
  const onArray = String(num).split("");
  return onArray.reduce((acc, curr, index, arr) => {
    const newAcc = [...acc, arr.slice(0, index + 1).join("")];

    return newAcc;
  }, []);
}
console.log(createArrayOfTiers(420));