首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用javascript中的嵌套对象来平平对象

如何使用javascript中的嵌套对象来平平对象
EN

Stack Overflow用户
提问于 2020-04-20 22:29:52
回答 6查看 6.9K关注 0票数 2

我有来自父对象内部的嵌套对象的一些属性,但我希望将嵌套对象与父对象合并为扁平对象。

原始对象:

代码语言:javascript
运行
复制
enrollment = {
  user: {
    id: 'string',
    name: 'string'
  },
  finished: 'boolean',
  path: 'string'
}

预期扁平物体:

代码语言:javascript
运行
复制
user: {
  id: 'string',
  name: 'string',
  finished: 'boolean',
  path: 'string'
}
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2020-04-21 01:31:38

您可以递归地构建对象,任意数量的嵌套对象。因此,这个函数不是依赖于情况的

代码语言:javascript
运行
复制
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, {}))

票数 4
EN

Stack Overflow用户

发布于 2021-02-09 13:46:52

我需要一些避免重写键的东西,的名称与原始对象中不同级别的名称相同。所以我写了如下:

代码语言:javascript
运行
复制
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);

还检查对象是否为null,因为我在使用中遇到了一些问题。

票数 2
EN

Stack Overflow用户

发布于 2020-04-20 23:01:37

下面是一种快速而肮脏的方法来平平您的对象:

代码语言:javascript
运行
复制
var enrollment = {
    user: {
        id: 'string',
        name: 'string',
    },
    fineshed: true,
    path: false,
};

var user = Object.assign(enrollment.user);
user.fineshed = enrollment.fineshed;
user.path = enrollment.path;

对于一个泛型方法,有几个没有共享密钥名的警告,并且只有1级深度:

代码语言:javascript
运行
复制
var enrollment = {
	user: {
		id: 'string',
		name: 'string',
	},
	fineshed: true,
	path: false,
};

const flatten = (object) => {
	let value = {};
	for (var property in object) {
		if (typeof object[property] === 'object') {
			for (var p in object[property]) {
				value[p] = object[property][p];
			}
		} else {
			value[property] = object[property];
		}
	}

	return value;
};

let user = flatten(enrollment);

console.log(user);

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61333126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档