4

Я изучаю функциональное программирование с помощью javascript, и у меня возникают проблемы с перестановками значений.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] 

И я не понимаю, почему, потому что я первый добавить значение indiceY на месте indiceX, и делает тот же самый материал только после, но и для другого значения ..

Любая идея, что я Неправильно?

EDIT: Некоторые уточнения, он должен переставлять два элемента массива длины N, например:

permute([1, 3, 2, 6], 0,2) // should return [2, 3, 1, 6] 

EDIT 2: Я опубликовал решение на моем GitHub счет

https://github.com/Skahrz/immutable-permute

+0

Должно быть, это просто реверсирование предметов? – RomanPerekhrest

+1

Может быть, сначала вы назначаете первый элемент второму индексу, тогда вы получаете второй элемент, который теперь фактически является изначально первым элементом. Теперь вы помещаете его на первое место, в результате чего первый элемент находится в обоих местах. –

+0

Во второй раз я помещаю его в индекс с индексом indiceX, напротив первого раза. Так что это должно быть хорошее значение нет? – mfrachet

ответ

1

Может быть, сначала вы назначаете первый элемент второму индексу, затем получаете второй элемент, который на самом деле является первоначально первым элемент. Теперь вы помещаете его на первое место, в результате чего первый элемент находится в обоих местах.

3

В дополнение к @ 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 swap array elements

+0

Две функции всегда лучше, чем одна: D – ftor

Смежные вопросы