Плоский массив для многомерного массива (JavaScript)

У меня есть следующий массив:

var sampleArray = [
  "CONTAINER",
  "BODY",
  "NEWS",
  "TITLE"];

Я хочу получить следующий вывод:

var desiredOutput = [{
        "CONTAINER": [{
            "BODY": [{
                "NEWS": [{
                    "TITLE": []
                }]
            }]
        }]
    }];

Как я могу достичь этого в JavaScript?

Уже пробовал с рекурсивным циклом, но он не работает, дает мне undefined.

    dataChange(sampleArray);
    function dataChange(data) {
        for (var i = 0; i < data.length; i++) {
            changeTheArray[data[i]] = data[i + 1];
            data.splice(i, 1);
            dataChange(changeTheArray[data[i]]);
        }
    }

Спасибо

Ответ 1

Это будет сделано:

const sampleArray = ["CONTAINER", "BODY", "NEWS", "TITLE"];
const data = [];    // Starting element.
let current = data; // Pointer to the current element in the loop

sampleArray.forEach(key => {     // For every entry, named `key` in `sampleArray`,
    const next = [];             // New array
    current.push({[key]: next}); // Add `{key: []}` to the current array,
    current = next;              // Move the pointer to the array we just added.
});

console.log(data);

Ответ 2

Это делает то, о чем вы просите, в одной строке и без дополнительных переменных:

let desiredOutput = sampleArray.reduceRight((obj, key) => [ { [key]: obj } ], []);

Вызов reduceRight, начиная с правой стороны массива, постепенно накапливает текущие данные (засеянные начальным значением []) в качестве значения единственного ключа в новом объекте { [key] : _value_ }, где этот объект сам по себе является одиночной записью в массиве [ ... ].

Ответ 3

Привет, я сделал немного demo:

var sampleArray = [
      "CONTAINER",
      "BODY",
      "NEWS",
      "TITLE"
    ], 
    generateArray = [], 
    tmp = null;

for(var i = 0; i < sampleArray.length; i++) {
  if(tmp===null){
    generateArray[sampleArray[i]] = {};
    tmp = generateArray[sampleArray[i]];
  }else{
    tmp[sampleArray[i]] = {};
    tmp = tmp[sampleArray[i]];
  }         
}

console.log(generateArray);