Alex
Alex

Reputation: 2062

Having troubles flattening array of objects

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

Answers (2)

Alex
Alex

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

Dupocas
Dupocas

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

Related Questions