Javascript,在数组中按功能排列两项

Javascript,在数组中按功能排列两项,javascript,arrays,functional-programming,ecmascript-6,immutability,Javascript,Arrays,Functional Programming,Ecmascript 6,Immutability,我正在学习javascript函数编程,在处理值置换时遇到了一些问题 实际上,我有一个数组,看起来像: [2, 1] 我需要在没有变异的情况下获得功能: [1, 2] 通过这种方式,我编写了一个permute函数,它使用一些ES6功能来完成这项工作: export function permute (arr, indiceX, indiceY) { const intermediateArray = [ ...arr.slice(0, indiceX), arr[indi

我正在学习javascript函数编程,在处理值置换时遇到了一些问题

实际上,我有一个数组,看起来像:

[2, 1]
我需要在没有变异的情况下获得功能:

[1, 2]
通过这种方式,我编写了一个permute函数,它使用一些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帐户上发布了解决方案


可能是第一个,将第一个元素分配给第二个索引,然后得到第二个元素,现在实际上是第一个元素。现在,您也将其放在第一位,从而在两个位置产生第一个元素。

除了@MohitBhardwaj的答案之外,如果您将自己限制为“函数”表达式,则解决方案可能如下所示:

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];
}

但是,由于您已经使用了声明,您可以使用“真实世界”解决方案,方法是复制输入数组,然后按照

进行操作,这应该只是项目的反转吗?可能是首先将第一个元素指定给第二个索引,然后获得第二个元素,现在实际上是第一个元素。现在,你把它也放在第一位,导致第一个元素在两个位置。第二次,我把它放在indiceX值,与第一次相反。所以它应该是好的值不?
[…data.reverse()]
我很困惑。。。两元素列表的唯一排列是相反的列表。为什么所有的额外代码?两个函数总是比一个好:D