Javascript 在展平对象阵列时遇到问题

Javascript 在展平对象阵列时遇到问题,javascript,Javascript,我试图通过将具有多个属性的内部对象转换为字符串,然后用该字符串替换对象的内容,通过使用delete关键字删除属性,然后添加具有相同名称的字符串属性,来减少对象数组。出于某种原因,删除某些属性后,代码仍在其上运行,但现在它是一个字符串,而不是一个对象,代码崩溃。例如,下一个对象: var person={ id:2, userNames:[{name:"jack1", email:"jack1@ccc.com"},

我试图通过将具有多个属性的内部对象转换为字符串,然后用该字符串替换对象的内容,通过使用delete关键字删除属性,然后添加具有相同名称的字符串属性,来减少对象数组。出于某种原因,删除某些属性后,代码仍在其上运行,但现在它是一个字符串,而不是一个对象,代码崩溃。例如,下一个对象:

    var person={
                id:2, 
                userNames:[{name:"jack1", email:"jack1@ccc.com"}, 
                           {name:"superjack", email:"superjack@bbb.com"}],
                empryProp:"",
                empryArr:[],
                booleanProp:true
               }
最终目标是将此对象展平到:

    var person={
                id:2, 
                userNames:"jack1 jack1@ccc.com; superjack superjack@bbb.com",
                empryProp:"",
                empryArr:[],
                booleanProp:true
               }
JS:

$'按钮'。单击'按钮',函数{ 函数展平ArroFobjectSarayofObject{ 设tmpVa=; 设tmpProp=; arrayOfObj.forEachavatarObj=>{ 让阿凡达出现在阿凡达Robj中{ 如果avatarProp===dateCreated | | avatarProp===dateModified{ avatarObj[AvataRpop]=新日期avatarObj[AvataRpop].toLocaleDateString; 持续 } 如果avatarObj[avatarProp].length==0|| avatarObj[avatarProp]==|| avatarObj[avatarProp]==0|| typeofavatarObj[avatarProp]==布尔值|| avatarObj的类型[avatarProp]==编号{ 持续 }否则{ //让我们来决定什么是虚拟现实。单个字符串?字符串数组?对象数组? if Array.isArrayavatarObj[avatarProp]{ //它是数组。字符串还是对象? avatarObj[avatarProp].forEachelement=>{ 如果typeofelement==对象{ //它是一个对象数组 avatarObj[avatarProp].forEachobj=>{ tmpProp=avatarProp; 为了让阿凡达在obj中出现{ 如果avatarProp==dateCreated | | avatarProp===dateModified | | avatarProp==id{ 持续 }否则{ tmpVa+=avatarProp+-+obj[avatarProp]+; } } }; 删除avatarObj[tmpProp]; avatarObj[tmpProp]=tmpVa; tmpProp=; tmpVa=; }否则{ //字符串数组 avatarObj[avatarProp]=avatarObj[avatarProp].join; } }; } } } }; 返回arrayOfObj; } 变量personObj=[{ 账户:[], 地址:[{ 国家:西班牙, 城市:马德里, 街道:某处街道, 电话:44 }], 年龄:44,, 国家:西班牙, 创建日期:2019-06-19T16:09:24.73, 修改日期:2019-07-15T12:15:34.94, 描述:一些描述, 设备:0, 教育:[{ 学校:圣查尔斯, 学位:硕士, id:3, 创建日期:2019-06-19T16:09:24.73 }, { 学校:圣克莱尔, 学位:未完成, id:2, 创建日期:2018-06-19T16:09:24.73 }], 电子邮件:[{ 创建日期:2019-06-19T16:09:24.73, 邮寄:mymail@kkk.com }, { 创建日期:2015-06-19T16:09:24.73, 邮寄:dddddd@kkk.com }], 收藏夹:[], 性别:2, id:23, 图像:[], 标签:错误, 兴趣:[宠物猫,我喜欢扔茄子], 是的, 语言:[{ 语言:英语, isDefault:正确 }, { 语言:西班牙语, isDefault:错误 }], 报告:[], maritalStatus:0, 姓名:西耶纳, 姓名:[{ 姓名:西耶纳, isDefault:正确 }, { 语言:Marel, isDefault:错误 }], 昵称:[], 电话号码:[{ 语言:英语, isDefault:正确 }, { 语言:西班牙语, isDefault:错误 }], pictureUrl:/clientapp/images/blanks/p_profile icon_large_dark.png, 政治定位:, 用户代理:, 工作场所:[{ 公司名称:苹果, 职位:主席 }, { 公司名称:英特尔, 工作:实验室工作人员 }] }]; console.logflattarrofobjectspersonobj; }; 扁平物体 const person={ id:2, 用户名:[{name:jack1,电子邮件:jack1@ccc.com }, {姓名:superjack,电子邮件:superjack@bbb.com }], empryProp:, empryArr:[], booleanProp:对 } const flatPerson=person=>{ 人 用户名:person.userNames.mapuser=>`${user.name}${user.email}`.join';' }
logflatPersonperson最终迭代了所有对象及其键,过滤掉了不需要的属性,另一方面又从我需要的属性中创建了字符串

function flat(arrayOfExportedObjects) {
    arrayOfExportedObjects.forEach(exportedObj => {
        for (let prop in exportedObj) {
            if (typeof exportedObj[prop] !== "string" && typeof exportedObj[prop] !== "number" && exportedObj[prop].length > 0) {
                if(Array.isArray(exportedObj[prop]) && typeof(exportedObj[prop][0]) === "string"){
                    exportedObj[prop] = exportedObj[prop].join("; ");
                    continue;
                }
                let str="";
                for(let p=0; p < exportedObj[prop].length; p++){
                    for(let property in  exportedObj[prop][p]){
                        if(property === "dateCreated" || property === "dateModified" || property === "id" || property === "isDefault"){
                            continue;
                        }else{
                            str += exportedObj[prop][p][property]+ " ";
                        }
                    }
                    str +="; ";
                }
                exportedObj[prop] = str;
                str="";
            }else{
                if(exportedObj[prop].length === 0 || exportedObj[prop] === "" || !exportedObj[prop]){
                    exportedObj[prop]=" ";
                }
            }
        }
    });
    return arrayOfExportedObjects;
}

消息:TypeError:avatarObj[avatarProp]。我知道,forEach不是一个函数。这正是我不明白的原因。我正在删除一个属性,添加另一个属性,我希望代码移动到下一个属性,而不是在同一个属性上再次运行它是一个对象,但现在它是一个字符串我不完全熟悉这种语法,请解释一下好吗?此外,我需要支持转换对象数组的选项。您所说的“我需要支持转换对象数组的选项”是什么意思
'感谢您的解释,但这看起来您只是在映射user.email和user.name。在我最初的帖子中,我有一个非常复杂的person对象。还是我遗漏了什么?@undroid如果单击“运行代码段”,您将看到输出的确切内容。在映射整个对象时,您只能看到明确提到的用户名,因为这是唯一需要根据user.name和user.email采用不同形状的属性。person部分意味着从person获取所有信息,然后userNames:部分仅覆盖userNames属性。结果是你原来的人的一个肤浅的副本,但是用户名值被覆盖了。我现在要失业了,回家后我会更新答案
function flat(arrayOfExportedObjects) {
    arrayOfExportedObjects.forEach(exportedObj => {
        for (let prop in exportedObj) {
            if (typeof exportedObj[prop] !== "string" && typeof exportedObj[prop] !== "number" && exportedObj[prop].length > 0) {
                if(Array.isArray(exportedObj[prop]) && typeof(exportedObj[prop][0]) === "string"){
                    exportedObj[prop] = exportedObj[prop].join("; ");
                    continue;
                }
                let str="";
                for(let p=0; p < exportedObj[prop].length; p++){
                    for(let property in  exportedObj[prop][p]){
                        if(property === "dateCreated" || property === "dateModified" || property === "id" || property === "isDefault"){
                            continue;
                        }else{
                            str += exportedObj[prop][p][property]+ " ";
                        }
                    }
                    str +="; ";
                }
                exportedObj[prop] = str;
                str="";
            }else{
                if(exportedObj[prop].length === 0 || exportedObj[prop] === "" || !exportedObj[prop]){
                    exportedObj[prop]=" ";
                }
            }
        }
    });
    return arrayOfExportedObjects;
}