How to remove empty objects from array of objects?

Chinmayee1
Giga Contributor

Hi,

In an integration , I have to pass the sys_id and fetch the attachments of that record.

-some records have multiple attachments and some have none

-Passing the sys_id in for loop.

Issue : Getting empty arrays along with arrays that has values

below is my script include

getAttachment : function(arrayString){
var r = new sn_ws.RESTMessageV2('Knowledge Integration for Bulk upload', 'Get Article');
r.setStringParameter('Accept', 'application/json');
r.setEndpoint('https://bayersidev.service-now.com/api/sn_km_api/knowledge/articles/'+arrayString);    
var response = r.execute();
var responseBody = response.getBody();    
var parser = new JSONParser();
var parsed = parser.parse(responseBody);
var recordSysId=[];

if(parsed.result.attachments.length !=undefined)
{
var contentArr = [];
var num = new GlideRecord(parsed.result.template_table);
num.addQuery("u_bayer_fmo_number",parsed.result.number);
num.query();
if(num.next()){
recordSysId =num.sys_id;
}
var attachmentLength = parsed.result.attachments.length;
for(var n =0;n<attachmentLength;n++)
    {
var attachment ={};
attachment.attachmentID=parsed.result.attachments[n].sys_id;
attachment.sysid=parsed.result.sys_id;
attachment.file_name = parsed.result.attachments[n].file_name;
attachment.size_bytes = parsed.result.attachments[n].size_bytes;
attachment.table=parsed.result.template_table;
attachment.recordSysId = recordSysId;

contentArr.push(attachment);
    }

    gs.log("attachment json :"+contentArr);
    return JSON.stringify(contentArr);

}
},
   

Below is my scheduled job

var arrayString=[],contentArr=[],attachmentMap=[],embeddedID=[],embedContentMap=[];
var kbUpload = new KnowledgeBulkUpload;
arrayString = kbUpload.searchArticle();

gs.log("ArrayString :"+arrayString.length);//

for(var a=0;a<arrayString.length;a++){
kbUpload.getArticle(arrayString[a]);}

for(var b=0;b<arrayString.length;b++){
contentArr = kbUpload.getAttachment(arrayString[b]);
}

gs.log("Attachments :"+contentArr.length);

for(var i=0;i<contentArr.length;i++){
attachmentMap = kbUpload.attachmentUpdate(contentArr[i]);}

 

below are the logs

Attachments :[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][{"attachmentID":"128c35941b9d14541c6442eacd4bcbf2","sysid":"828cf9541b9d14541c6442eacd4bcbc4","file_name":"JIRA Workflow Demand Management (1).pptx","size_bytes":"576420","table":"u_kb_template_end_user"},{"attachmentID":"2e8cb9941b9d14541c6442eacd4bcb4c","sysid":"828cf9541b9d14541c6442eacd4bcbc4","file_name":"Workflow Status Matrix.xlsm","size_bytes":"101326","table":"u_kb_template_end_user"},{"attachmentID":"5e8c35941b9d14541c6442eacd4bcbf0","sysid":"828cf9541b9d14541c6442eacd4bcbc4","file_name":"JIRA with myCloud.docx","size_bytes":"736265","table":"u_kb_template_end_user"}],[],[],[]

 

attachment json :

 

find_real_file.png

How do I eliminate the empty ones and pass only the ones with value to my script include? I need to pass each json object to another function and it should run only three times as obj.length.

 

Please help.

Thanks & Regards,

Chinmayee Mishra

27 REPLIES 27

yes, It doesn't print finalArray.

@Chinmayee 

the earlier script I shared worked fine

Script I tried: It has 1 empty object in the array in 2nd position; it removed that

var contentArr = [{"name":"abel"},{},{"name":"beth"}];

var finalArr = [];
for(var i in contentArr){
if(Object.keys(contentArr[i]).length === 0){
gs.info("ignore");
}
else{
finalArr.push(contentArr[i]);
}
}

gs.info('Original array'+JSON.stringify(contentArr));

gs.info('New array'+JSON.stringify(finalArr));

Output:

find_real_file.png

Regards
Ankur

Regards,
Ankur
✨ Certified Technical Architect  ||  ✨ 9x ServiceNow MVP  ||  ✨ ServiceNow Community Leader

The reason why its working for you is because 1 array is holding multiple arrays.

[{},{},{}] . for me its [{a},{},{}][{},{},{}][{},{},{}][][][][]

Hi,

in that case you can iterate over each array element which itself is an array and then run the check on that and push in final array

can you share your complete array

Regards
Ankur

Regards,
Ankur
✨ Certified Technical Architect  ||  ✨ 9x ServiceNow MVP  ||  ✨ ServiceNow Community Leader

Hi, 

Its in my first post. Where I posted the question. Would you mind letting me know why the recordSysId is not getting added to the json? I added logs , inside If block. It prints. Inside for loop it doesn't. I even tried pasting that glide block to fetch the recordsysId inside for loop. It doesn't work. Can you advise me on that?

 

Thanks in advance