Плоский массив для многомерного массива (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
работает немного контр-интуитивно:
- построить a новый элемент для нажатия. Это присваивает новое значение
current
. - нажмите новый элемент на ссылка
.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);