[英]Jquery\JS - Having troubles creating an array of objects from input fields
[英]Having troubles flattening array of objects
我试图通过将具有多个属性的内部对象转换为字符串,然后用该字符串替换该对象的内容,通过使用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:
function flattenArrOfObjects(arrayOfObj){
let tmpVa = "";
let tmpProp = "";
arrayOfObj.forEach(avatarObj => {
for(let avatarProp in avatarObj){
if (avatarProp === "dateCreated" || avatarProp === "dateModified") {
avatarObj[avatarProp] = new Date(avatarObj[avatarProp]).toLocaleDateString();
continue;
}
if(avatarObj[avatarProp].length === 0 ||
avatarObj[avatarProp] === "" ||
avatarObj[avatarProp] === 0 ||
typeof(avatarObj[avatarProp])=== "boolean" ||
typeof avatarObj[avatarProp] === "number"){
continue;
}else{
//lets decide what avatarProp is. single string? array of strings? array of objects?
if(Array.isArray(avatarObj[avatarProp])){
//its an array. strings or objects?
avatarObj[avatarProp].forEach(element => {
if(typeof(element) === "object"){
//its an array of objects
avatarObj[avatarProp].forEach(obj => {
tmpProp = avatarProp;
for(let avatarProp in obj){
if(avatarProp === "dateCreated" || avatarProp === "dateModified" || avatarProp === "id"){
continue;
}else{
tmpVa += avatarProp + " - " + obj[avatarProp]+"; ";
}
}
});
delete avatarObj[tmpProp];
avatarObj[tmpProp] = tmpVa;
tmpProp = "";
tmpVa = "";
}else{
//array of strings
avatarObj[avatarProp] = avatarObj[avatarProp].join("; ");
}
});
}
}
}
});
return arrayOfObj;
}
$('button').on('click', function() { function flattenArrOfObjects(arrayOfObj) { let tmpVa = ""; let tmpProp = ""; arrayOfObj.forEach(avatarObj => { for (let avatarProp in avatarObj) { if (avatarProp === "dateCreated" || avatarProp === "dateModified") { avatarObj[avatarProp] = new Date(avatarObj[avatarProp]).toLocaleDateString(); continue; } if (avatarObj[avatarProp].length === 0 || avatarObj[avatarProp] === "" || avatarObj[avatarProp] === 0 || typeof(avatarObj[avatarProp]) === "boolean" || typeof avatarObj[avatarProp] === "number") { continue; } else { //lets decide what avatarProp is. single string? array of strings? array of objects? if (Array.isArray(avatarObj[avatarProp])) { //its an array. strings or objects? avatarObj[avatarProp].forEach(element => { if (typeof(element) === "object") { //its an array of objects avatarObj[avatarProp].forEach(obj => { tmpProp = avatarProp; for (let avatarProp in obj) { if (avatarProp === "dateCreated" || avatarProp === "dateModified" || avatarProp === "id") { continue; } else { tmpVa += avatarProp + " - " + obj[avatarProp] + "; "; } } }); delete avatarObj[tmpProp]; avatarObj[tmpProp] = tmpVa; tmpProp = ""; tmpVa = ""; } else { //array of strings avatarObj[avatarProp] = avatarObj[avatarProp].join("; "); } }); } } } }); return arrayOfObj; } var personObj = [{ accounts: [], addresses: [{ country: "spain", city: "madrid", street: "someStreet", number: 44 }], age: 44, country: "spain", dateCreated: "2019-06-19T16:09:24.73", dateModified: "2019-07-15T12:15:34.94", description: "some description", device: 0, education: [{ school: "saint charles", degree: "master", id: 3, dateCreated: "2019-06-19T16:09:24.73" }, { school: "saint clair", degree: "not finished", id: 2, dateCreated: "2018-06-19T16:09:24.73" }], emails: [{ dateCreated: "2019-06-19T16:09:24.73", mail: "mymail@kkk.com" }, { dateCreated: "2015-06-19T16:09:24.73", mail: "dddddd@kkk.com" }], favorites: [], gender: 2, id: 23, images: [], tab: false, interests: ["pet cats", "i love to throw eggplants"], isActive: true, languages: [{ language: "english", isDefault: true }, { language: "spanish", isDefault: false }], reports: [], maritalStatus: 0, name: "Sienna", names: [{ name: "Sienna", isDefault: true }, { language: "Marel", isDefault: false }], nicknames: [], phoneNumbers: [{ language: "english", isDefault: true }, { language: "spanish", isDefault: false }], pictureUrl: "/clientapp/images/blanks/p_profile icon_large_dark.png", politicalOrientation: "", userAgent: "", workPlaces: [{ company: "apple", job: "chairman" }, { company: "intel", job: "lab worker" }] }]; console.log(flattenArrOfObjects(personObj)); });
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <button>flat objects</button>
const person = { id: 2, userNames: [{ name: "jack1", email: "jack1@ccc.com" }, { name: "superjack", email: "superjack@bbb.com" }], empryProp: "", empryArr: [], booleanProp: true } const flatPerson = person =>({ ...person, userNames: person.userNames.map(user => `${user.name} ${user.email}`).join('; ') }) console.log(flatPerson(person))
flatPerson
是一个函数,它接受一个person
参数,然后返回一个对象,该对象是原始person对象...person
的扩展,并覆盖userNames
属性,将每个对象转换为字符串: userNames.map(user =>
$ {user .NAME} $ {user.email} )
和在通过所述分离器为一个字符串变换最终数组: ;
最终遍历所有对象及其键,过滤掉不需要的属性,另一方面从我需要的属性中创建字符串。
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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.