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