Нетерминальное решение с reduce
:
const data = [["Key","data1"],["header.title","data2"],["header.tag1","data3"],["header.tag2","data4"],["body.text","data5"],["updates.title","data6"],["updates.text","data7"],["footer.title","data8"],["footer.row1.col1.title","data9"],["footer.row1.col1.text","data10"],["footer.row1.col2.title","data11"],["footer.row1.col2.text","data12"],["footer.row1.col3.title","data13"],["footer.row1.col3.text","data14"],["footer.row2.col1.title","data15"],["footer.row2.col1.text","data16"],["footer.row2.col2.title","data17"],["footer.row2.col2.text2","data18"],["footer.row2.col3.title","data19"],["footer.row2.col3.text","data20"],["footer.row3.col1.title","data22"],["footer.row3.col1.text","data23"],["footer.row3.col2.title","data24"],["footer.row3.col2.title","data25"],["footer.row3.col2.text","data26"],["footer.row3.col3.title","data27"],["footer.row3.col3.text","data28"],["footer.row4.col1.title","data29"],["footer.row4.website","data30"],["footer.row4.website-link","data31"],["footer.row4.email","data31"],["footer.row4.privacy","data32"],["footer.row4.privacy-link","data33"],["footer.row4.adr","data34"],["footer.row4.adr2","data35"],["other.short.des","data36"],["other.promovideo","data37"]]
const result = data.reduce((all, [keys, val]) => {
keys.split('.').reduce((obj, key, i, arr) => {
if (i === arr.length - 1) {
obj[key] = val;
} else {
if (!obj.hasOwnProperty(key)) {
obj[key] = {};
};
}
return obj[key];
}, all);
return all;
}, {});
console.log(result);
Указатель - это просто обычная переменная, которая содержит адрес для чего-то еще в качестве значения. Другими словами, указатель указывает на адрес, где можно найти что-то еще.
Когда вы выделяете:
c = calloc(2,sizeof(float *));
Вы назначаете начальный адрес для нового блока памяти на c
. Другими словами, c
указывает на место в памяти, где находятся первые (из двух) указателей, которые вы выделили.
Когда вы назначаете (глагол):
assign = c;
Вы устанавливаете значение, удерживаемое assign
, на значение, удерживаемое c
. (и что держит c
? - адрес блока памяти, выделенного вами calloc
). Так что теперь assign
содержит тот же адрес, что и c
, например, assign
теперь указывает на первый (из двух) указателей, которые вы выделили. Так что assign
и c
теперь содержат один и тот же адрес в качестве их значения, и вы можете использовать любой из них для ссылки на то, что там хранится.
примечание: нет необходимости разыгрывать возврат malloc
, это не нужно. Смотрите: Я разыгрываю результат malloc? . Кроме того, если вы используете разыменованный указатель для установки размера шрифта для выделения, вы исключаете вероятность ошибочного определения, например,
c = calloc (2, sizeof *c);