📅  最后修改于: 2023-12-03 15:25:13.992000             🧑  作者: Mango
有时候,我们需要将一个嵌套的 JavaScript 对象转换为单深度对象,以便于序列化、查询等操作。这里介绍几种方法可以实现对象扁平化。
Object.assign()
function flattenObject(obj) {
return Object.assign({}, ...function _flatten(childObj, prefix = '') {
return [].concat(
...Object.keys(childObj).map(
key => typeof childObj[key] === 'object' ? _flatten(childObj[key], `${prefix}${key}.`) : {[`${prefix}${key}`]: childObj[key]}
)
);
}(obj));
}
这个方法使用 Object.assign()
函数将扁平化后的对象合并到一个新的对象中。我们首先创建一个 _flatten()
函数来递归地迭代对象,处理每个元素,并将它们转换为键-值对的数组。最后使用 Object.assign()
函数将结果数组中的多个元素合并到一个对象中。
function flattenObject(obj, prefix = '') {
return Object.keys(obj).reduce((acc, k) => {
const pre = prefix.length ? prefix + '.' : '';
if (typeof obj[k] === 'object') {
Object.assign(acc, flattenObject(obj[k], pre + k));
} else {
acc[pre + k] = obj[k];
}
return acc;
}, {});
}
这个方法使用递归函数,首先将对象的所有键名存入一个数组,然后使用 reduce()
方法将它们合并为一个单深度对象。
function flattenObject(obj) {
const result = {};
function recurse(cur, prop) {
if (Object(cur) !== cur) {
result[prop] = cur;
} else if (Array.isArray(cur)) {
for (let i = 0, l = cur.length; i < l; i++)
recurse(cur[i], `${prop}[${i}]`);
if (l === 0)
result[prop] = [];
} else {
let isEmpty = true;
for (let p in cur) {
isEmpty = false;
recurse(cur[p], prop ? `${prop}.${p}` : p);
}
if (isEmpty && prop)
result[prop] = {};
}
}
recurse(obj, '');
return result;
}
这个方法使用循环来遍历对象及其属性,将它们转换为单深度对象。递归函数 recurse()
首先检查当前对象是否为基础类型,如果是,则将其保存到结果对象中;否则,它将检查当前对象是否为数组,如果是,它将递归地处理数组元素,否则将递归地处理对象的属性。
以上是三种常见的方法将嵌套的 JavaScript 对象扁平化为单深度对象。每个方法都有自己的优点和缺点,选择哪种方法取决于项目的需要和开发者的喜好。