Сопоставить значения вложенного массива с Map с функциональностью для установки значений Map по индексу массива, который будет отражен во вложенном массиве по ссылке - PullRequest
0 голосов
/ 17 февраля 2019

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

[0, [1, [2, [3 /* , [N, [N+1, [..]]] */]]]]

или

["a", ["b", ["c", ["d" /* , [N, [N+1, [..]]] */]]]]

, где arr - экземпляр Arrayи и map экземпляр Map требует, чтобы каждая глубина отображалась на объект Map, где

map.get(2) // 2

или

map.get(2) // "c"

получает набор значенийво вложенном массиве с индексом N, где N - линейные индексы вложенного массива.

Кроме того, необходимо иметь возможность выполнять

m.set(2, "x")

, чтоприведет к

["a", ["b", ["x", ["d" /* , [N, [N+1, [..]]] */]]]]

удалось создать структуру данных вложенного массива с использованием Array.prototype.map() и двух дополнительных Array.

Возможно, отсутствует простая настройка, которую можно сделать длядостичь ожидаемой функциональности.Текущий код выполняет только процедуру m.get(<index>).

const treeMap = (tree, props = (!Array.isArray(tree) && typeof tree === "string" 
      ? tree.split` ` 
      : tree), res = [], t = [], m = new Map) => props.map((prop, index) => 
      !res.length // first iteration
      ? res.push(prop, t) && m.set(index, prop) // push first value
      : index < props.length-1 // check index
        ? t.push(prop, t = []) && m.set(index, prop) // `.push()` to `t`, re-declare `t` as `[]`
        : t.push(prop) && m.set(index, t[0])) // `.push()` last value `prop` to `t`
    && [res, m] // return `res`


let [arr, map] = treeMap("a b c");

console.log(arr, map);

console.log(map.get(2));

// console.log(treeMap([...Array(3).keys()]));
// [0, [1, [2, [3]]]]

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

Как выполнить вышеописанное требование?

1 Ответ

0 голосов
/ 17 февраля 2019

Я бы сконструировал Map внутреннюю для функции treeMap, назову ее mapOfArrs, которая сопоставляет каждый индекс с соответствующим вложенным массивом.Например, при вводе a b c:

mapOfArrs.get(0) // -> ['a', ['b', ['c']]]
mapOfArrs.get(1) // -> ['b', ['c']]
mapOfArrs.get(2) // -> ['c']

Затем вы можете вернуть объект psuedo-Map, который при вызове с помощью get(prop) обращается к mapOfArrs.get(prop)[0], чтобы получить соответствующее вложенное значение,в то время как set(prop) извлекает вложенный массив с помощью mapOfArrs.get(prop) и присваивает новое значение его 0-му индексу, mapOfArrs.get(prop)[0] = newVal;.

Из-за внутренней карты доступ / изменение любого из вложенных значений будет иметь O(1) сложность:

const treeMap = (tree) => {
  const [initialItem, ...restItems] = Array.isArray(tree)
    ? tree
    : tree.split(' ');
  const root = [initialItem];
  const mapOfArrs = new Map()
    .set(0, root);
  // Construct the nested structure, putting the newly created arrays in mapOfArrs too:
  restItems.reduce((a, item, i) => {
      const newArr = [item];
      a.push(newArr);
      // we sliced off the first item for the initial value, so have to increment i by 1:
      mapOfArrs.set(i + 1, newArr);
      return newArr;
    }, root);
  
  const psuedoMap = {
    get(prop) {
      return mapOfArrs.get(prop)[0];
    },
    set(prop, newVal) {
      mapOfArrs.get(prop)[0] = newVal;
      return this;
    }
  };
  return [root, psuedoMap];
};

let [arr, map] = treeMap("a b c");

console.log(arr);
console.log(map.get(0), map.get(1), map.get(2));
map.set(2, "x")
   .set(0, 'zzz');
console.log(arr);
console.log(map.get(0), map.get(1), map.get(2));

(Map.prototype.set не имеет побочных эффектов, поэтому внешний вызов, например, map.set(2, "x") имеет для выполнения пользовательской функции, а не через Map.prototype.set, для связанного массива, который также должен быть мутирован)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...