仅使用`.reduce()`交换JavaScript中数组中的2个元素?

时间:2019-02-16 17:41:28

标签: javascript functional-programming reduce

我想找出在JavaScript中是否可以仅使用.reduce来完成交换元素。如果不是,那么应该从功能编程领域使用什么?

这不是用于对数组进行排序。我想使用.reduce查找数组元素的所有排列,这需要按照this方法进行交换步骤。

3 个答案:

答案 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