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帐户上发布了该解决方案
https://github.com/Skahrz/immutable-permute
除了@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];
}
但是由于您已经使用了声明,因此您可以通过复制输入数组然后遵循Javascript交换数组元素来寻求"实际"解决方案
可能是首先将第一个元素分配给第二个索引,然后你得到第二个元素,现在实际上是原来的第一个元素。现在,您也将它放在第一位,从而在两个位置都产生第一个元素。
相关文章:
- 如何使用仅显示/查看两个项目的甘特图
- 使用javascript根据值将项目分组到两个级别
- 使弹性项目一次包装两个
- Javascript 库,一次包含两个项目
- 请问JavaScript中的两个项目有什么区别
- 下划线.js,从一个对象中获取两个项目并添加到顶部
- 如何在两个不同数组中的项目之间建立链接
- Javascript localStorage unshift 数组在两个项目后停止追加
- Javascript 比较两个大小不同的数组,并返回不在第二个数组中的项目
- 如何在 mvc 项目中同步这两个计时器
- Maven结合了两个项目
- 缩放两个项目
- 在同一集合中添加两个项目
- 下拉|材料设计|两个项目|重叠
- 如何在MVC上的两个列表框之间移动项目-JQuery不起作用
- 显示基于彼此的两个下拉列表中的项目
- select2.js-如何在选项元素内对齐两个项目
- 筛选和比较两个项目的列表
- 猫头鹰旋转木马,一次滚动两个项目
- 如何在列表框中获得选定项目的索引,并添加到列表框两个按钮