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

如何在javascript中用嵌套对象展平对象,javascript,Javascript,我有一些来自父对象内部嵌套对象的属性,但我希望将嵌套对象与要展平的父对象合并 原始对象: 注册={ 用户:{ id:'字符串', 名称:“字符串” }, 完成:'布尔', 路径:“字符串” } 预期展平对象: 用户:{ id:'字符串', 名称:“字符串”, 完成:'布尔', 路径:“字符串” } 以下是一种快速而肮脏的展平对象的方法: var注册={ 用户:{ id:'字符串', 名称:“字符串”, }, 真的, 路径:false, }; var user=Object.assign(reg

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

原始对象:

注册={
用户:{
id:'字符串',
名称:“字符串”
},
完成:'布尔',
路径:“字符串”
}
预期展平对象:

用户:{
id:'字符串',
名称:“字符串”,
完成:'布尔',
路径:“字符串”
}

以下是一种快速而肮脏的展平对象的方法:

var注册={
用户:{
id:'字符串',
名称:“字符串”,
},
真的,
路径:false,
};
var user=Object.assign(registration.user);
user.fineshed=registration.fineshed;
user.path=enrollment.path;

对于没有共享键名且仅展平1级深度的两个警告的通用方法:

var注册={
用户:{
id:'字符串',
名称:“字符串”,
},
真的,
路径:false,
};
常数展平=(对象)=>{
让值={};
for(对象中的var属性){
if(对象的类型[属性]=“对象”){
for(对象[属性]中的var p){
值[p]=对象[属性][p];
}
}否则{
值[属性]=对象[属性];
}
}
返回值;
};
让用户=展平(注册);

console.log(用户)以下是一种快速而肮脏的展平对象的方法:

var注册={
用户:{
id:'字符串',
名称:“字符串”,
},
真的,
路径:false,
};
var user=Object.assign(registration.user);
user.fineshed=registration.fineshed;
user.path=enrollment.path;

对于没有共享键名且仅展平1级深度的两个警告的通用方法:

var注册={
用户:{
id:'字符串',
名称:“字符串”,
},
真的,
路径:false,
};
常数展平=(对象)=>{
让值={};
for(对象中的var属性){
if(对象的类型[属性]=“对象”){
for(对象[属性]中的var p){
值[p]=对象[属性][p];
}
}否则{
值[属性]=对象[属性];
}
}
返回值;
};
让用户=展平(注册);

console.log(用户)只需要一个对象:

const注册={
用户:{
id:'字符串',
名称:“字符串”
},
完成:'布尔',
路径:“布尔”
}
函数propsToUser(enrollObj){
常量u={…enrollObj.user};
对于(让我加入OBJ){
如果(i!=='user')u[i]=enrollObj[i];
}
返回u;
}
const user=propsToUser(注册);

console.log(用户)只需要一个对象:

const注册={
用户:{
id:'字符串',
名称:“字符串”
},
完成:'布尔',
路径:“布尔”
}
函数propsToUser(enrollObj){
常量u={…enrollObj.user};
对于(让我加入OBJ){
如果(i!=='user')u[i]=enrollObj[i];
}
返回u;
}
const user=propsToUser(注册);

console.log(用户)您可以递归地构建任意数量的嵌套对象。因此,此函数不依赖于您的大小写:

var注册={
用户:{
id:'字符串',
名称:“字符串”
},
完成:'布尔',
路径:“布尔”
}
变量注册2={
用户:{
id:'字符串',
名称:“字符串”
},
测试:{
测试1:{
测试2:{
val0:'val0',
test4:{//3级嵌套对象,例如
val1:‘val1’,
val2:‘val2’
}
}
}
},
完成:'布尔',
路径:“布尔”
}
常数平坦=(obj,out)=>{
Object.keys(obj.forEach)(key=>{
如果(对象的类型[键]=“对象”){
out=flat(obj[key],out)//递归调用嵌套
}否则{
out[key]=obj[key]//直接赋值
}
})
返回
}
log(平面(注册,{}))

log(flat(enrollment2,{}))
您可以递归地构建任意数量的嵌套对象。因此,此函数不依赖于您的大小写:

var注册={
用户:{
id:'字符串',
名称:“字符串”
},
完成:'布尔',
路径:“布尔”
}
变量注册2={
用户:{
id:'字符串',
名称:“字符串”
},
测试:{
测试1:{
测试2:{
val0:'val0',
test4:{//3级嵌套对象,例如
val1:‘val1’,
val2:‘val2’
}
}
}
},
完成:'布尔',
路径:“布尔”
}
常数平坦=(obj,out)=>{
Object.keys(obj.forEach)(key=>{
如果(对象的类型[键]=“对象”){
out=flat(obj[key],out)//递归调用嵌套
}否则{
out[key]=obj[key]//直接赋值
}
})
返回
}
log(平面(注册,{}))

log(flat(enrollment2,{}))
我需要一些可以避免重写原始对象中不同级别的同名键的东西。所以我写了以下内容:

const flattobject=(obj,parentKey='')=>{
如果(parentKey!='')parentKey+='';
设平坦={};
Object.keys(obj.forEach)((key)=>{
if(对象[键]==='object'&&obj[键]!==null的类型){
赋值(展平,展平对象(obj[key],parentKey+key))
}否则{
展平[parentKey+key]=obj[key]
}
})
返回平直;
}
var测试={
福:“酒吧”,
有些是‘东西’,
父亲:{
son1:‘son1值’,
儿子2:{
孙辈:“孙辈价值”,
duplicatedKey:“注意这也用于第一级”,
},
},
duplicatedKey:“注意,这也在son2中使用”,
}
放平=放平物体(试验);
控制台。原木(平);
//如何访问展开的关键点:
让a=扁平[‘父子二孙’];

控制台日志(a)我需要一些可以避免用s重写键的东西
{
        name:'Namig',
        surname:'Hajiyev',
        address:{
            city:'Sumgait',
            country:'Azerbaijan',
            geo: {
                lat:'40.5897200',
                long:'49.6686100'
            }
        }
    }
{
  "name": "Namig",
  "surname": "Hajiyev",
  "address.city": "Sumgait",
  "address.country": "Azerbaijan",
  "address.geo.lat": "40.5897200",
  "address.geo.long": "49.6686100"
}