使用 reduce 组合一个累积字符串数组

6
我希望能返回像这样的内容 ['4','42','420'] ,给定数字为:420
我正在使用reduce来累加数字,并使用索引将前面的数字串联起来。前两次迭代工作得很好,但是在第三次迭代中,我遇到了问题,因为结果是未定义的 => [ '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)

6个回答

3
如果您想收集数字的增量,我认为更明确的方法是使用.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));


这个回答真的让我受益匪浅,我终于理解了你关于 curr 的评论,并且用我的代码想出了解决方案。 - elisa

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));


1

试试这个:

function createArrayOfTiers(num) {
  const str = String(num);
  const res = str.split('').reduce((acc, curr, index) => {
    acc = [...acc, str.substring(0,index)+curr];
    return acc;
  }, []);
  return res;
}

console.log( createArrayOfTiers(420) );


0

我的方式

const createArrayOfTiers = arg =>
        [...String(arg)].reduce((r,c,i)=>[...r, (r[i-1]||'')+c],[])

 
console.log('420 -->' ,JSON.stringify( createArrayOfTiers(420) ));
console.log("'elisa' -->" ,JSON.stringify( createArrayOfTiers('elisa') ));
.as-console-wrapper{max-height:100% !important;top: 0;}


0
你可以通过使用一个存储最后结果值的字符串的闭包来映射字符串值。

function createArrayOfTiers(num) {
    return Array.from(num.toString(), (s => v => s += +v)(''));
}

console.log(createArrayOfTiers(420));

reduce 方面...

function createArrayOfTiers(num) {
    return [...num.toString()].reduce((r, v) => [...r, (r[r.length - 1] || '') + v], []);
}

console.log(createArrayOfTiers(420));


0
感谢本线程中的CertainPerformance,我理解了我试图访问curr中不存在的数组索引,因此我需要访问acc值的索引,并想出了使用我的代码更新版本的解决方案:

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

createArrayOfTiers(420)

我还将curr转换为数组,因为在只有一个数字的情况下,也应该返回一个数组。

感谢所有提供了出色想法的人!!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接