<div class="container">
<p>您可以在左右两边修改数据查看效果,请注意保证正确的结构</p>
<p>分别点击两个按钮进行左右两个结构的转换</p>
<div class="main">
<textarea id="data" rows="26" cols="40"></textarea>
<div>
<p><button id="flat-btn">转换 >></button></p>
<p><button id="parse-btn"><< 转换</button></p>
</div>
<textarea id="flated" rows="26" cols="40"></textarea>
</div>
<p id="error"></p>
</div>
function flat(param, parentKey = "") {
if (!param || typeof param !== "object") {
result[parentKey] = param;
return;
}
const isArray = Array.isArray(param);
result = isArray ? [] : {};
for (let key in param) {
const curKey = isArray ? `${parentKey}[${key}]` : `${parentKey}${parentKey === "" ? "" : "."}${key}`;
const item = param[key];
if (item && typeof item === "object") {
result = { ...result, ...flat(item, curKey) };
} else {
result[curKey] = item;
}
}
return result;
};
function parse(param) {
if (typeof param !== 'object') {
return param;
}
const result = Array.isArray(param) ? [] : {};
const getCurKey = (curKey) => {
return curKey.startsWith('[') ? curKey.match(/\d+/)[0] : curKey;
};
const setKey = (key, val) => {
const keyArr = key
.replace(/\[(\d+)\]/g, ($1, $2) => {
if ($1) {
return `.[${$2}]`;
}
return $1;
})
.split('.');
const { length } = keyArr;
let i = 0;
let obj = result;
while (i < length - 1) {
const isArray = keyArr[i + 1].startsWith('[');
const item = getCurKey(keyArr[i]);
if (!obj[item]) {
obj[item] = isArray ? [] : {};
}
obj = obj[item];
i++;
}
obj[getCurKey(keyArr[length - 1])] = val;
};
for (let key in param) {
setKey(key, param[key]);
}
return result;
}