Используйте 2D указатель без выделения

Нетерминальное решение с 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);
1
задан Mohammadreza Farahani 19 January 2019 в 06:26
поделиться

1 ответ

Указатель - это просто обычная переменная, которая содержит адрес для чего-то еще в качестве значения. Другими словами, указатель указывает на адрес, где можно найти что-то еще.

Когда вы выделяете:

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);
0
ответ дан David C. Rankin 19 January 2019 в 06:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: