如何在javascript中使用嵌套对象展平对象

我有一些来自父对象内部的嵌套对象的属性,但我想将嵌套对象与要展平的父对象合并。


原始对象:


enrollment = {

  user: {

    id: 'string',

    name: 'string'

  },

  finished: 'boolean',

  path: 'string'

}

预期的展平对象:


user: {

  id: 'string',

  name: 'string',

  finished: 'boolean',

  path: 'string'

}


噜噜哒
浏览 266回答 3
3回答

慕虎7371278

您可以递归地构建对象任意数量的嵌套对象。因此,此功能与您的情况无关:var enrollment = {user: {    id: 'string',    name: 'string'},finished: 'boolean',path: 'boolean'}var enrollment2 = {user: {    id: 'string',    name: 'string'},test: {    test1: {        test2: {            val0:'val0',            test4: { //3rd level nested object for example                val1: 'val1',                val2: 'val2'            }        }    }},finished: 'boolean',path: 'boolean'}const flat = (obj, out) => {    Object.keys(obj).forEach(key => {        if (typeof obj[key] == 'object') {            out = flat(obj[key], out) //recursively call for nesteds        } else {            out[key] = obj[key] //direct assign for values        }    })    return out}console.log(flat(enrollment, {}))console.log(flat(enrollment2, {}))

慕尼黑5688855

我需要一些东西来避免重写原始对象中不同级别的同名键。所以我写了以下内容:const flattenObject = (obj, parentKey = '') => {    if (parentKey !== '') parentKey += '.';    let flattened = {};    Object.keys(obj).forEach((key) => {        if (typeof obj[key] === 'object' && obj[key] !== null) {            Object.assign(flattened, flattenObject(obj[key], parentKey + key))        } else {            flattened[parentKey + key] = obj[key]        }    })    return flattened;}var test = {    foo: 'bar',    some: 'thing',    father: {        son1: 'son1 value',        son2: {            grandchild: 'grandchild value',            duplicatedKey: 'note this is also used in first level',        },    },    duplicatedKey: 'note this is also used inside son2',}let flat = flattenObject(test);console.log(flat);// how to access the flattened keys:let a = flat['father.son2.grandchild'];console.log(a);还检查对象是否为空,因为我在使用时遇到了一些问题。

慕田峪7331174

使用递归和归约。请注意,如果 value 本身是一个包含对象的数组,您可能需要!Array.isArray(value)根据您的情况添加另一个检查function flatObj(obj) {  return Object.entries(obj).reduce(    (flatted, [key, value]) =>      typeof value == "object"        ? { ...flatted, ...flatObj(value) }        : { ...flatted, [key]: value },    {}  );}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript