Плоский массив для многомерного массива (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);