如何将 JavaScript 对象压平为单深度对象?

1. 前言

JavaScript 是一种弱类型语言,因此可以轻松地创建多层嵌套的对象。例如:

const obj = {

a: {

b: {

c: 1

}

}

}

这个对象有三个嵌套层级。然而,在某些情况下,我们希望将对象压扁成一个单层对象,例如,当我们需要将对象写入数据库或将其序列化为 JSON 字符串时。在本文中,我们将学习如何将嵌套的 JavaScript 对象压平成一个单深度对象。

2. 什么是单深度对象?

单深度对象是一个没有嵌套属性的 JavaScript 对象。例如,一个单深度对象如下所示:

const obj = {

a: 1,

b: 2,

c: 3

}

可以看出,单深度对象只有一个层级,即它的所有属性没有任何嵌套。

3. 实现对象压平方法

3.1 方法一:使用递归

第一种方法是使用递归。我们可以在递归函数中迭代嵌套的对象,并将其属性添加到一个新对象中。如果对象的属性本身还是一个对象,则递归到该属性并继续迭代,直到找到所有属性。

以下是一个使用递归方法将对象压平的示例代码:

function flattenObject(obj) {

let flattened = {}

for (let key in obj) {

if (!obj.hasOwnProperty(key)) continue

if (typeof obj[key] === 'object' && obj[key] !== null) {

let flatObject = flattenObject(obj[key])

for (let subKey in flatObject) {

if (!flatObject.hasOwnProperty(subKey)) continue

flattened[key + '.' + subKey] = flatObject[subKey]

}

} else {

flattened[key] = obj[key]

}

}

return flattened

}

// 示例

const nestedObject = {

a: {

b: {

c: 1

},

d: 2

},

e: 3

}

const flattenedObject = flattenObject(nestedObject)

console.log(flattenedObject)

// { 'a.b.c': 1, 'a.d': 2, e: 3 }

在递归函数中,我们先创建了一个新的对象 flattened,用于存储压平后的对象。接下来,我们通过 for...in 循环迭代原始对象 obj 的属性。

如果当前属性的值是一个对象(但不是 null),则我们递归地调用此函数,并将其返回的结果添加到目标对象中。我们将属性名使用一个点连接,并将其设置为目标对象的键,这有助于将属性添加到正确的层级中。

如果当前属性的值是一个普通值(即不是对象或 null),则我们将其直接添加到从递归函数返回的目标对象中。

3.2 方法二:使用 reduce() 方法

第二个方法是使用 reduce() 方法。我们可以使用 reduce() 方法的回调函数来将嵌套的对象转换为一个单深度的对象。以下是一个使用 reduce() 方法将对象压平的示例代码:

function flattenObject(obj) {

function reducer(acc, currentValue, key) {

if (typeof currentValue === 'object' && currentValue !== null) {

let flatObject = flattenObject(currentValue)

for (let subKey in flatObject) {

if (!flatObject.hasOwnProperty(subKey)) continue

acc[key + '.' + subKey] = flatObject[subKey]

}

} else {

acc[key] = currentValue

}

return acc

}

return Object.keys(obj).reduce((acc, key) => reducer(acc, obj[key], key), {})

}

// 示例

const nestedObject = {

a: {

b: {

c: 1

},

d: 2

},

e: 3

}

const flattenedObject = flattenObject(nestedObject)

console.log(flattenedObject)

// { 'a.b.c': 1, 'a.d': 2, e: 3 }

在 reduce() 方法中,我们传递了一个回调函数 reducer。在回调函数中,我们执行与递归方法中相同的操作:如果属性的值是一个对象,我们递归地调用此函数,并将其结果添加到目标对象中;否则,我们直接将值添加到目标对象中。

我们使用 Object.keys() 方法获取对象中的所有键,并将其传递给 reduce() 方法。在回调函数中,我们迭代所有键,同时将当前键的对应值传递给 reducer() 函数。reduce() 方法将初始值设置为空对象 {},并返回最终的压平对象。

4. 总结

在本文中,我们讨论了将嵌套的 JavaScript 对象压平成一个单深度对象的两种方法。第一种方法是使用递归,将所有嵌套属性添加到一个新对象中,直到达到单深度。第二种方法是使用 reduce() 方法,它使用回调函数将所有嵌套属性转换为一个单深度对象。这两种方法都可以很容易地将嵌套对象转换为单深度对象,并且选择哪种方法取决于您的个人偏好和项目要求。