дифференцировать одинаковые значения в массиве, js - PullRequest
0 голосов
/ 24 сентября 2018

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

Итак, если вы представите такой массив:

let myArray = Array(10, 10, 10, 10, 9);

Я хочу выразить еготакой алгоритм:

  1. Взять первый элемент массива (10) (index = 0).
  2. проверить, есть ли элемент в массиве с таким же значением.да, есть - с индексом 1. если нет, проверьте следующий элемент ...
  3. измените myArray [0] на myArray [0] + 1
  4. измените myArray [1] на myArray [1] - 1
  5. return myArray

Теперь массив выглядит следующим образом:

myArray = Array(11, 9, 10, 10, 9)

Теперь он запускается снова, а следующие шаги возвращают такой массив:

myArray = Array(11, 10, 10, 10, 8) 
myArray = Array(11, 11, 9, 10, 8)
myArray = Array(12, 10, 9, 10, 8)
myArray = Array(12, 11, 9, 8, 8)
myArray = Array(12, 11, 10, 9, 7)

Теперь, поскольку существуют только уникальные значения, он заканчивается.Это легко сделать с помощью циклов while и for, но как я могу сделать это с помощью функционального программирования ES6?

K.

1 Ответ

0 голосов
/ 24 сентября 2018

Вы можете использовать вложенную итерацию с коротким замыканием, если найдены два одинаковых значения.

function fn(array) {
    return array.some((v, i, a) => a.slice(i + 1).some((w, j) => { 
        if (v === w) {
            ++a[i];
            --a[i + j + 1];
            return true;
        }
    }));
}
    
var array = [10, 10, 10, 10, 9];

console.log(array.join(' '));
while (fn(array)) console.log(array.join(' '));
.as-console-wrapper { max-height: 100% !important; top: 0; }

Более функциональный стиль, который возвращает новый массив

const
    init = j => (v, i, a) => j !== -1
        ? i === j ? v - 1 : v
        : (j = a.indexOf(v, i + 1)) !== -1 ? v + 1 : v,
    upDown = () => init(-1);
    
var array = [10, 10, 10, 10, 9];

do {
    console.log(array.join(' '))
} while (array.join() !== (array = array.map(upDown())).join())
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...