Reputation: 2062
I'm trying to reduce an array of objects by converting the inner objects with several properties, to string, and then replace the content of the object with that string, by removing the property with delete
keyword, and then adding a string property with the same name. For some reason, after I delete some property, my code still runs over it, but now its a string, not an object and the code crashes. For example the next object:
var person={
id:2,
userNames:[{name:"jack1", email:"[email protected]"},
{name:"superjack", email:"[email protected]"}],
empryProp:"",
empryArr:[],
booleanProp:true
}
The end goal is to flat this object to:
var person={
id:2,
userNames:"jack1 [email protected]; superjack [email protected]",
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: "[email protected]"
}, {
dateCreated: "2015-06-19T16:09:24.73",
mail: "[email protected]"
}],
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>
Upvotes: 0
Views: 66
Reputation: 2062
Ended up iterating over all objects and their keys, filtering out un-needed properties and on the other hand creating strings out of those that I do need.
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;
}
Upvotes: 0
Reputation: 21297
const person = {
id: 2,
userNames: [{ name: "jack1", email: "[email protected]" },
{ name: "superjack", email: "[email protected]" }],
empryProp: "",
empryArr: [],
booleanProp: true
}
const flatPerson = person =>({
...person,
userNames: person.userNames.map(user => `${user.name} ${user.email}`).join('; ')
})
console.log(flatPerson(person))
flatPerson
is a function which takes a person
argument and then return an object which is the spread of the original person object ...person
and overrides the userNames
property, transforming each object into a string: userNames.map(user =>
${user.name} ${user.email})
and transform the final array in a string passing the separator as: ;
Upvotes: 1