我不明白为什么.reduce javascript方法后会收到此输出

时间:2019-09-22 20:17:57

标签: javascript arrays

这是我的代码:

nicknames = {'RAM' : 'Black', 'ELC': 'Mamba', 'FAD' : 'Samba', 'NOP' : 'STOP'}

const nickGet = (initials) => {

 return initials.match(/.{1,3}/g).reduce((arr, trio) => {
    if (!nicknames[trio]) throw new Error('Invalid trio')
    return [...arr, nicknames[trio]]

})
}

当我运行nickGet(“ ELCRAM”)时,我得到以下输出:

["E", "L", "C", "Black"]

我知道,如果要执行此操作,应将[]的初始值设置为减小。但是,我想知道为什么当我不这样做时,我会把这个具体信息弄清楚。如何在数组中将ELC划分为单独的值?这背后的逻辑是什么?

谢谢!

编辑,尝试使用地图功能:

var nicknames = { RAM: 'Black', ELC: 'Mamba', FAD: 'Samba', NOP: 'STOP' };

const nickGet = (initials) => {
  var nick = initials.match(/.../g).map((trio) => {
    if (!nicknames[trio]) throw new Error('Invalid trio')
    return nicknames[trio]

  }, []);

nick.length = nick.findIndex(element => element == "STOP");
return nick;
};

是否要这样做,以使地图在碰到STOP时才停止?不知道该用什么代替“什么”。

1 个答案:

答案 0 :(得分:3)

您不提供一个空数组作为累加器的起始值。

在第一个循环中,字符串ELC分散为单个字符,因为这是arr的值。作为trio,您将获得RAM并将此值转换为'Black'

var nicknames = { RAM: 'Black', ELC: 'Mamba', FAD: 'Samba', NOP: 'STOP' };

const nickGet = (initials) => {
  return initials.match(/.../g).reduce((arr, trio) => {
    if (!nicknames[trio]) throw new Error('Invalid trio')
    return [...arr, nicknames[trio]];
  }, []);
};

console.log(nickGet('ELCRAM'));
console.log([...'ELC']);