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,

you should declare it as string and not array

var recordSysId=''; // correct way

Regards
Ankur

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

yes.I tried that too. It still doesn't print inside for loop. Its scope issue.

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();
gs.log("responsebodyAttach:"+responseBody);

var parser = new JSONParser();
var parsed = parser.parse(responseBody);
var recordSysId;
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;
}
gs.log("recordSysId :"+recordSysId);
var contentArr = [];
if(parsed.result.attachments.length !=undefined)
{

var attachmentLength = parsed.result.attachments.length;
for(var n =0;n<attachmentLength.length;n++)
{
gs.log("recordSysId in for:"+recordSysId);
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);
},

Hello,

can you help me to check empty value in the array?

If there will be below array, second object doesnt have any value. How to exclude such data?

/Petr

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

Hi,

you need to parse the json and then check if the object has field with value

Regards
Ankur

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