【发布时间】:2019-07-14 17:58:24
【问题描述】:
我正在尝试使用reduce() 以“整理”顺序组合一组数组,以便具有相似索引的项目放在一起。例如:
input = [["one","two","three"],["uno","dos"],["1","2","3","4"],["first","second","third"]]
output = [ 'first','1','uno','one','second','2','dos','two','third','3','three','4' ]
索引相似的项目的顺序并不重要,只要它们在一起,所以'one','uno','1'...的结果和上面的一样好。如果可能的话,我想只使用不可变变量。
我有一个可行的方法:
const output = input.reduce((accumulator, currentArray, arrayIndex)=>{
currentArray.forEach((item,itemIndex)=>{
const newIndex = itemIndex*(arrayIndex+1);
accumulator.splice(newIndex<accumulator.length?newIndex:accumulator.length,0,item);
})
return accumulator;
})
但它不是很漂亮,我也不喜欢它,特别是因为它改变了 forEach 方法中的累加器的方式。我觉得一定有更优雅的方法。
我不敢相信以前没有人问过这个问题,但我尝试了很多不同的查询但找不到它,所以请告诉我它是否存在并且我错过了它。有没有更好的办法?
为了澄清 cmets 中的每个问题,我希望能够在不改变任何变量或数组的情况下做到这一点,就像我对 accumulator.splice 所做的那样,并且只使用函数方法,例如 .map 或 @987654327 @ 不是像 .forEach 这样的变异循环。
【问题讨论】:
-
“有更好的方法吗?”“更好”是什么意思? “我不喜欢” 不是客观的编码问题。有什么要求?
-
好吧,我想做的一件事是不改变任何变量,或者引入一个没有真正功能的
.forEach循环。而且我认为它也可以做得更简洁。如果我可以像在 Python 中一样将一组数组压缩在一起,那么这样减少(连接)它们也可以。 -
我想我很清楚地说我希望结果不会改变任何数组或变量,就像我对
accumulator.splice所做的那样。这是客观要求。 -
该要求是否包括限制使用
JSON.parse(JSON.stringify(input))以避免改变原始数组? -
我从所有这些答案中学到了很多。我很难选择一个作为“解决方案”,因为有很多有趣的方法可以解决这个问题,所以我觉得只选择一个很糟糕。我选择的那个最接近我的想法,虽然不一定是最好的。谢谢大家。
标签: javascript arrays functional-programming