最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

functional programming - Using only `.reduce()` to swap 2 elements in the array in JavaScript? - Stack Overflow

programmeradmin1浏览0评论

I would like to find out if swapping elements can be done using only .reduce in JavaScript. If not, what else should be used from the functional programming land?

This is not for sorting an array. I wanted to find all the permutations of the array element using .reduce which required the swap step as per this method.

I would like to find out if swapping elements can be done using only .reduce in JavaScript. If not, what else should be used from the functional programming land?

This is not for sorting an array. I wanted to find all the permutations of the array element using .reduce which required the swap step as per this method.

Share Improve this question edited Feb 16, 2019 at 18:25 shivangg asked Feb 16, 2019 at 17:41 shivanggshivangg 60110 silver badges15 bronze badges 3
  • do you have an example of the array and why you use reduce for it? – Nina Scholz Commented Feb 16, 2019 at 17:43
  • You usually change the order of the elements of an array using .sort(). – Titus Commented Feb 16, 2019 at 17:43
  • Do you want to create a new array instance, with two values swapped, or just (mutably) swap to elements of an array? – Bergi Commented Feb 16, 2019 at 18:43
Add a ment  | 

3 Answers 3

Reset to default 4

You could take a function which takes an array and two indices and uses a 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);

A version with reduce by taking an array of indices and swap all pairs from start to end.

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);

In es6, the idiomatic way to swap array elements is:

;[a[i], a[j]] = [a[j], a[i]]

Using .reduce is not appropriate for this task. You could technically do something like this:

a = a.reduce((acc, element, idx) => {
    acc.push(idx === i ? a[j] : idx === j ? a[i] : a[idx])
    return acc
}, [])

but it would result in convoluted code.

If your goal is to avoid mutating the original array, you can use Object.assign:

b = Object.assign([], a, {[i]: a[j], [j]: a[i]})

The reduce function reduces the array to a value of an object, as defined by the 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

The sort() method sorts the elements of an array in place and returns the array. The default sort order is built upon converting the elements into strings, then paring their sequences of UTF-16 code units values.

  

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]

And you answer your question, reduce can't be used for swapping elements. You will have to either use sort for write your custom sort function

发布评论

评论列表(0)

  1. 暂无评论