Преобразование одномерного массива в многомерный массив - PullRequest
0 голосов
/ 24 декабря 2018

В Javascript, как преобразовать одномерный массив в многомерный массив неопределенной глубины или длины.

Пример:

let input = ['a','b','b','b','a','a','b','b','b','c','c','a','a','b','b'];
const makeMatrix = () => {}

let output = makeMatrix(input);

// output: ['a',['b','b','b'],'a','a',['b','b','b',['c','c']],'a','a',['b','b']]

Как должна выглядеть функция makeMatrix для достижения этой целизадача?Предположим, что значения всегда движутся в линейном направлении вперед, но, возможно, могут срезаться назадТак что а всегда ведет к б.А никогда не перепрыгнет с.Но c может вернуться к a.

Это попытка преобразовать элементы заголовка в оглавление.Создать простой одноуровневый ток легко, но создание многоуровневого тряска поражает мой мозг.Я просмотрел несколько решений, но не увидел ничего, что решило бы эту конкретную проблему.

Ответы [ 3 ]

0 голосов
/ 24 декабря 2018

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

var input = ['a', 'b', 'b', 'b', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'a', 'a', 'b', 'b'],
    levels = [[]],
    level = 0,
    result;

input.forEach(v => {
    var l = level;
    do {
        if (levels[l][0] === v) {
            level = l;
            levels[level].push(v);
            return;
        }
    } while (l--)
    levels[level].push(levels[level + 1] = [v]);
    level++;
});

result = levels[0][0];

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 24 декабря 2018

Альтернативная версия, использующая JSON building / parsing:

const input = ['a', 'b', 'b', 'b', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'a', 'a', 'b', 'b'];

const result = JSON.parse(Object.entries(input).reduce((json, [key, val]) => {
  const jsonVal = JSON.stringify(val);
  const diff = key > 0 ? val.charCodeAt(0) - input[key - 1].charCodeAt(0) : 0;
  if (diff > 0) {
    json += ',['.repeat(diff) + jsonVal;
  } else if (diff < 0) {
    json += ']'.repeat(-diff) + ',' + jsonVal;
  } else {
    json += (key > 0 ? ',' : '') + jsonVal;
  }
  return json;
}, '[') + ']'.repeat(input.slice(-1)[0].charCodeAt(0) - input[0].charCodeAt(0) + 1));

console.log(result);

Это в основном строит строку JSON, используя Array.reduce во входном массиве, добавляя каждый элемент и сравнивая коды клавиш, чтобы включить правильное количество открывающих / закрывающих скобок в процессе..

0 голосов
/ 24 декабря 2018

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

function toMulti(arr) {
    let str = "[";
    let level = 1;
    const charLevels = { a: 1, b: 2, c: 3 };
    arr.forEach(char => {
        const charLevel = charLevels[char];
        if (level < charLevel) {
            for (let i = 0; i < charLevel - level; i++) {
                str += "[";
            }
        }
        if (level > charLevel) {
            for (let i = 0; i < level - charLevel; i++) {
                str += "],";
            }
        }
        level = charLevel;
        str += `'${char}',`;
    });
    for (let i = 0; i < level; i++) {
        str += "]";
    }
    return eval(str);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...