繁体   English   中英

展平对象数组时遇到麻烦

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM