#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
существовал.