我想找出在JavaScript中是否可以仅使用.reduce
来完成交换元素。如果不是,那么应该从功能编程领域使用什么?
这不是用于对数组进行排序。我想使用.reduce
查找数组元素的所有排列,这需要按照this方法进行交换步骤。
答案 0 :(得分:2)
您可以采用一个函数,该函数采用一个数组和两个索引,并使用一个destructuring assignment。
const swap = (array, i, j) => [array[i], array[j]] = [array[j], array[i]];
var array = [1, 2, 3];
swap(array, 0, 1)
console.log(array);
一个带有reduce的版本,通过获取一组索引并从头到尾交换所有对。
const
swap = (array, ...indices) =>
indices.reduce((a, b) => ([array[a], array[b]] = [array[b], array[a]], b));
var array = [1, 2, 3];
swap(array, 0, 1)
console.log(array);
答案 1 :(得分:1)
在es6中,交换数组元素的惯用方式是:
;[a[i], a[j]] = [a[j], a[i]]
使用.reduce
不适用于此任务。从技术上讲,您可以执行以下操作:
a = a.reduce((acc, element, idx) => {
acc.push(idx === i ? a[j] : idx === j ? a[i] : a[idx])
return acc
}, [])
但是会导致代码混乱。
如果您的目标是避免突变原始数组,则可以使用Object.assign
:
b = Object.assign([], a, {[i]: a[j], [j]: a[i]})
答案 2 :(得分:1)
reduce
函数将数组简化为accumulator
定义的对象的值。
let array1 = [2, 5, 8, 0, 10];
let array2 = [1, 4, 9, 7, 6];
const reducer = (accumulator, currentValue) => accumulator + currentValue;
// 1 + 2 + 3 + 4
console.log(array1.reduce(reducer));
// expected output: 10
// 5 + 1 + 2 + 3 + 4
console.log(array1.reduce(reducer, 5));
// expected output: 15
sort()
方法对数组中的元素进行适当排序并返回数组。默认的排序顺序是基于将元素转换为字符串,然后比较其UTF-16代码单元值的序列而建立的。
var months = ['March', 'Jan', 'Feb', 'Dec'];
months.sort();
console.log(months);
// expected output: Array ["Dec", "Feb", "Jan", "March"]
const sortingAccending = (a, b) => a - b
let numbers = [4, 2, 5, 1, 3];
numbers.sort(sortingAccending);
console.log(numbers);
// expected output: Array [1, 100000, 21, 30, 4]
您回答了问题,reduce
不能用于交换元素。
您将必须使用sort
来编写自定义排序function