Join the #BuildWithBuildAgent Challenge! Get recognized, earn exclusive swag, and inspire the ServiceNow Community with what you can build using Build Agent.  Join the Challenge.

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

Hi,

Did you try the latest script I shared

Regards
Ankur

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

When I print finalArray, I am getting log as below

finalArray :function (from, to) {    return this.replace(from.toString(), to, "g");}

If contentArr is your array try 

contentArr = contentArr.filter(function(e){return e});

gs.print(contentArr); //This prints your array without empty elements

Hello Chinmayee,

Thats the beauty of Javascript.

Filter is a function which internally reads each element from your array and pass to variable e and then return back to the same array, if its not empty.

That code works perfectly fine. I just tested in my background script and it is working fine.

 

Is this what u r asking me to do ?

for(var b=0;b<arrayString.length;b++){
contentArr= kbUpload.getAttachment(arrayString[b]);
//attachmentMap = kbUpload.attachmentUpdate(contentArr);
contentArr = contentArr.filter(function(e){return e;});
}

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

 

It prints undefined.