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

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

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

Я хочу иметь следующий результат:

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

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

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

    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]]);
        }
    }

спасибо

3 ответов


это сделает это:

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);

{[key]: next} - это относительно новый синтаксис. Они имена вычисляемых свойств.

это:

const a = 'foo';
const b = {[a]: 'bar'};

похоже на:

const a = 'foo';
const b = {};
b[a] = 'bar';

вы мог бы переписать forEach как один-лайнер:

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

sampleArray.forEach(key => current.push({[key]: current = [] }));

console.log(data);

этой current.push работает немного контр-интуитивно:

  1. построить a новый элемент для нажатия. Это присваивает новое значение current.
  2. нажмите новый элемент на ссылка .push было.
    • эта ссылка является значением current до current = [].

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

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

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


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

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);