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.
- 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
3 Answers
Reset to default 4You 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