Javascript,按功能排列数组中的两项
Javascript, permute two items in array functionally
我正在学习 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 帐户上发布了解决方案
可能首先将第一个元素分配给第二个索引,然后得到第二个元素,现在实际上是最初的第一个元素。现在,您也将它放在首位,从而在两个位置都出现第一个元素。
除了@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
来寻求 'real-world' 解决方案
我正在学习 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 帐户上发布了解决方案
可能首先将第一个元素分配给第二个索引,然后得到第二个元素,现在实际上是最初的第一个元素。现在,您也将它放在首位,从而在两个位置都出现第一个元素。
除了@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
来寻求 'real-world' 解决方案