通过键(道具的位置未知)Javascript将对象添加到属性

通过键(道具的位置未知)Javascript将对象添加到属性,javascript,function,object,Javascript,Function,Object,我有一个这样的物体: defObj: { id: 101, email: 'jack@dev.com', personalInfo: { name: 'Jack', addresses: { firstAddress : { line1: 'westwish st', line2: 'washmasher', city: 'wa

我有一个这样的物体:

defObj:

{
 id: 101,
 email: 'jack@dev.com',
 personalInfo: {
        name: 'Jack',
        addresses: {
            firstAddress : {
                  line1: 'westwish st',
                  line2: 'washmasher',
                  city: 'wallas',
                  state: 'WX'
            }
        }
    }
}
像这样的物体:

addObj:

secondAddress : {
 line1: "aStreet",
 city : "aCity",
 state : "aState"
}
我想要一个这样的函数:

addObjectToProperty(defObj, propertyName, addObj);
基本上,它将defbj作为参数(如第一个对象),在其中搜索属性(如地址),并将obj添加到其中(基本上“类似”一个数组,但在我的情况下它不能是数组,它必须是一个对象。)

使用示例如下所示:

addObjectToProperty(defObj,"addresses",addObj);
结果会是这样的:

{
     id: 101,
     email: 'jack@dev.com',
     personalInfo: {
            name: 'Jack',
            addresses: {
                firstAddress : {
                      line1: 'westwish st',
                      line2: 'washmasher',
                      city: 'wallas',
                      state: 'WX'
                },secondAddress : {
                  line1: "aStreet",
                  city : "aCity",
                 state : "aState"
                 } 
            }
        }
    }
我如何实现这样的功能?我不能更改对象的结构(比如在对象内部放置数组),也不允许使用下划线.js之类的外部库

你好

如果我理解正确,您需要递归地在对象中搜索具有给定名称的属性,并将另一个对象的内容复制到其中。此函数的作用是:

function addObjectToProperty(toObj, underName, addObj) {
    for (let name in toObj) {
        if (name === underName) {
            Object.assign(toObj[name], addObj);
            return true;
        }
        if (typeof toObj[name] === 'object') {
            let added = addObjectToProperty(toObj[name], underName, addObj);
            if (added) return true;
        }
    }
}

在您的示例中进行了尝试(使用我在评论中提到的修改),得到了您要求的结果。

您可以通过检查对象的键和值来使用迭代和递归方法。如果未找到,则迭代嵌套对象

函数addObjectTopProperty(对象、键、值){
返回Object.entries(Object).some([k,v])=>
k==键
?对象分配(v,值)
:v&&typeof v==='object'&&addObjectTopProperty(v,键,值)
);
}
var defObj={id:101,电子邮件:'jack@dev.com,个人信息:{name:'Jack',地址:{firstAddress:{line1:'westwish st',line2:'washmasher',城市:'wallas',州:'WX'}},
addObj={第二地址:{ine1:“aStreet”,城市:“aCity”,州:“aState”};
AddObjectTopProperty(DEFBJ,“地址”,addObj);
控制台日志(defObj)

.as console wrapper{max height:100%!important;top:0;}
您可以循环
addObj
或者如果只有一个属性,那么

function addObjectToProperty(target, prop, source)
{
   var key = Object.keys(source)[0];
   target.personalInfo[prop][key] = source[key];
}
addObjectToProperty(defObj,"addresses",addObj);
但是如果有多个这样的键,那么迭代
source

function addObjectToProperty(target, prop, source)
{
   Object.keys(source).forEach( s => (target.personalInfo[prop][s] = source[s]) );
}
对象语法如下

secondAddress : {
 line1: "aStreet",
 city : "aCity",
 state : "aState"
}
这是错误的

您需要一个递归,它将检查键并传递另一个参数来命名这个新键

var defObj={
id:101,
电邮:'jack@dev.com',
个人信息:{
名字:“杰克”,
地址:{
第一地址:{
第1行:“westwish街”,
第二行:“洗衣机”,
城市:“瓦拉斯”,
声明:“WX”
}
}
}
}
var secondAddress={
第1行:“aStreet”,
城市:“城市”,
状态:“aState”
}
函数addObjectTopProperty(originalObj、prop、newObj、addName){
//在中使用for..迭代对象
用于(原始版本中的var键){
//检查键名是否匹配以及这是否是对象
如果(键===prop&&typeof originalObj[keys]====object'){
//增加新的价值
originalObj[keys][addName]=newObj;
}else if(原始键盘的类型[按键]=“对象”){
//否则,使用新值调用相同的函数
//这里originalObj[键]将发生变化
AddObjectTopProperty(originalObj[keys],prop,newObj,addName)
}
}
}
AddObjectTopProperty(defObj,“地址”,secondAddress,“secondAddress”);

console.log(defObj)
您为
addObj
给出的示例语法无效。
secondAddress:{…}
是指
{secondAddress:{…}}