我正在使用javascript学习函数式编程,我在处理值排列方面遇到了一些问题。
实际上,我有一个看起来像的数组:
[2, 1]
我需要在功能上获得,没有突变:
[1, 2]
这样,我编写了一个使用一些ES6功能来完成工作的置换功能:
export function permute (arr, indiceX, indiceY) {
const intermediateArray = [
...arr.slice(0, indiceX),
arr[indiceY],
...arr.slice(indiceX + 1)
]
console.log([
...intermediateArray.slice(0, indiceY),
intermediateArray[indiceX],
...intermediateArray.slice(indiceY + 1)
]) // prints [1, 1]
return [
...intermediateArray.slice(0, indiceY),
intermediateArray[indiceX],
...intermediateArray.slice(indiceY + 1)
]
}
使用此功能,我总是得到
[1, 1]
我不明白为什么,因为我首先在indiceX位置添加indiceY值,然后在其他值之后生成相同的东西..
知道我做错了什么?
编辑:有些精确,它应该置换长度为N的数组中的两个项目,例如:
permute([1, 3, 2, 6], 0,2) // should return [2, 3, 1, 6]
编辑2:我已经在我的github帐户上发布了解决方案
答案 0 :(得分:2)
除了@ MohitBhardwaj的答案之外,如果你将自己限制在' functional'表达式,解决方案可能如下所示:
function swap_ordered(a, i0, i1) {
return [...a.slice(0, i0), a[i1], ...a.slice(i0+1, i1), a[i0], ...a.slice(i1+1)];
}
function swap(a, i0, i1) {
return i0 != i1 ? swap_ordered(a, Math.min(i0, i1), Math.max(i0, i1)) : [...a];
}
但是既然你已经使用了声明,那么你可以去寻找现实世界中的声明。解决方法是复制输入数组,然后关注Javascript swap array elements
答案 1 :(得分:1)
可能首先将第一个元素分配给第二个索引,然后获得第二个元素,现在实际上是第一个元素。现在,您也将它放在第一位,从而在两个地方产生第一个元素。