Преобразование массива строк в объект с наибольшим внутренним дочерним элементом в пустой массив в JavaScript / Typescript

#javascript #typescript

#javascript #typescript

Вопрос:

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

 const ArrayPath = ["UNIVERSAL HIP", "STEM", "BFX"]
  

должен вернуться

 { 
  "Universal Hip": {
    "Stem": {
      "BFX": []
          }
     }
}
  

Это то, что я пробовал

 let arrayPath = ["UH", "STEM", "BFX"]
let obj = {}
const helper = (obj, arrayPath) => {

  if (arrayPath.length === 0) {
    return obj
  }
  
  obj[arrayPath[0]] = helper(obj[arrayPath[0]], arrayPath.slice(1))
  if (arrayPath.length === 1) {
    return {
      [arrayPath[0]]: []
    }
  } else {
    return obj
  }
}

console.log(helper(obj, helper))
  

Ответ №1:

  • Используя Array.reduceRight , вы можете получить желаемый результат. Он будет выполнять цикл от последнего индекса до первого индекса и выполнит обратный вызов. Теперь при обратном вызове он возвращает новый объект { [cur]: acc } .

Здесь acc это аккумулятор. И cur сохраняет текущее значение. Таким образом, это будет первый BFX , второй UNIVERSAL HIP , последний STEM . И { [cur]: acc } означает создание нового объекта с ключом ( cur значением переменной) и значением ( acc значением переменной).

  • Итак, первый случай, если cur = BFX , acc будет { BFX: [] }
  • И второй случай, если cur = UNIVERSAL HIP , acc будет { UNIVERSAL HIP: previous acc } таким {UNIVERSAL HIP: { BFX: [] }} .

Он будет зацикливаться на первом элементе, подобном этому.

 const arrayPath = [ "UNIVERSAL HIP", "STEM", "BFX" ];

const output = arrayPath.reduceRight((acc, cur) => ({ [cur]: acc }), []);
console.log(output);  

Комментарии:

1. На самом деле вы могли бы пропустить реверсирование и просто уменьшить-вправо , например arrayPath.reduceRight((acc, cur) => ({ [cur]: acc }), []) , он был доступен до тех пор, пока reduce существовал.