array.includes() always return false

Patrik Samuel T
Tera Contributor

Hi Guys,

I am having troubles with following function, which is checking whether user is member of a group and should also prevent looping (check is done elsewhere). Right after I call a function, I am adding userID to array of "checkedManagers", but if I then check if the array contains such userID, result is always false.

Code:

var checkedManagers = new Array();

function isApprovingManager(userID) {
    checkedManagers.push(userID);
//DEBUG CODE
	gs.addInfoMessage(userID + " added to checkedManagers: " + checkedManagers.toString());
	if (checkedManagers.includes(userID))
		{
			gs.addInfoMessage(userID + " LISTED");
		}
	else
		{
			gs.addInfoMessage(userID + " NOT LISTED");
		}
//DEBUG CODE
    var gr = new GlideRecord('sys_user_grmember');
    gr.addQuery('user', userID);
    gr.query();
    while (gr.next()) {
        if (gr.group == 'ddf3d1dedb4f20d0b56645403996196c') //Approving Manager = ddf3d1dedb4f20d0b56645403996196c
        {
            return true;
        }
    }
    return false;
}

Debug may look like:

2e7e51fcdb69470018aa9ee3db9619d8 added to checkedManagers: 00b0d9a1db761f80ba3f92b8db9619cf,c70fd9ecdb254700fd889414db961985,413539c0dbff2b40ba3f92b8db9619c9,0d9f1ae1dbd01410e98c6d6bd39619fb,2e7e51fcdb69470018aa9ee3db9619d8,2e7e51fcdb69470018aa9ee3db9619d8
2e7e51fcdb69470018aa9ee3db9619d8 NOT LISTED

Any ideas why the check fails?

I am quite sure its something stupidly simple, as always...

Thanks,

Patrik

1 ACCEPTED SOLUTION

Log the type of the userID variable you push into the array to make sure it's a string.

gs.info("Typeof userID: " + typeof userID);
checkedManagers.push(userID);

View solution in original post

11 REPLIES 11

Rogers Cadenhe1
Giga Guru

I'm not finding support for the includes() function for arrays in my PDI.

var abc = ["A", "B", "C"];
gs.info(abc.includes("B")); // displays undefined
gs.info(abc.indexOf("B")); // displays 1

Try this conditional using indexOf() instead instead:

if (checkedManagers.indexOf(userID) != -1)
  {
    gs.addInfoMessage(userID + " LISTED");
  }
else
  {
    gs.addInfoMessage(userID + " NOT LISTED");
  }

 

Rogers,

Funny, I was using .indexOf() before and then I changed to includes()... so that solved the issue in the function above!

One more place where I am having issue with this (line 7):

function getApprovingManager(userID) {
    var result = "no";
    var gr = new GlideRecord("sys_user");
    gr.get(userID);

    if (gr.manager) {
        if (checkedManagers.indexOf(gr.manager) == -1) {
//DEBUG CODE
			gs.addInfoMessage(gr.manager + " was NOT yet checked: " +checkedManagers.indexOf(gr.manager));
			gs.addInfoMessage(checkedManagers.toString());
//DEBUG CODE
            if (isApprovingManager(gr.manager)) {
                gs.addInfoMessage(gr.manager.user_name + " is Approving Manager");
                workflow.scratchpad.approver = gr.manager;
                result = "yes";
            } else {
                gs.addInfoMessage(gr.manager.user_name + " is NOT Approving Manager");
                result = this.getApprovingManager(gr.manager);
            }
        } else {
            gs.addInfoMessage(gr.manager.user_name + " has been already checked");
            return result;
        }
    } else {
        gs.addInfoMessage(gr.user_name + " has no manager");
        result = "no";
    }
    return result;
}

Debug output:

2e7e51fcdb69470018aa9ee3db9619d8 was NOT yet checked: -1
00b0d9a1db761f80ba3f92b8db9619cf,c70fd9ecdb254700fd889414db961985,413539c0dbff2b40ba3f92b8db9619c9,0d9f1ae1dbd01410e98c6d6bd39619fb,2e7e51fcdb69470018aa9ee3db9619d8,2e7e51fcdb69470018aa9ee3db9619d8,2e7e51fcdb69470018aa9ee3db9619d8,2e7e51fcdb69470018aa9ee3db9619d8

"2e7e51fcdb69470018aa9ee3db9619d8" Is in the array multiple times, but indexOf() still return -1.

Any ideas what I am doing wrong this time?

 

Full code if it helps anyone:

var requestedFor = current.request.requested_for;
gs.addInfoMessage(" Requested for: " + requestedFor.user_name);

var checkedManagers = new Array();

activity.result = getApprovingManager(requestedFor);

function getApprovingManager(userID) {
    var result = "no";
    var gr = new GlideRecord("sys_user");
    gr.get(userID);

    if (gr.manager) {
        if (checkedManagers.indexOf(gr.manager) == -1) {
			gs.addInfoMessage(gr.manager + " was NOT yet checked: " +checkedManagers.indexOf(gr.manager));
			gs.addInfoMessage(checkedManagers.toString());
            if (isApprovingManager(gr.manager)) {
                gs.addInfoMessage(gr.manager.user_name + " is Approving Manager");
                workflow.scratchpad.approver = gr.manager;
                result = "yes";
            } else {
                gs.addInfoMessage(gr.manager.user_name + " is NOT Approving Manager");
                result = this.getApprovingManager(gr.manager);
            }
        } else {
            gs.addInfoMessage(gr.manager.user_name + " has been already checked");
            return result;
        }
    } else {
        gs.addInfoMessage(gr.user_name + " has no manager");
        result = "no";
    }
    return result;
}

function isApprovingManager(userID) {
    checkedManagers.push(userID);
    //gs.addInfoMessage(userID + " added to checkedManagers: " + checkedManagers.toString());
    /*if (checkedManagers.indexOf(userID) != -1) {
        gs.addInfoMessage(userID + " LISTED");
    } else {
        gs.addInfoMessage(userID + " NOT LISTED");
    }*/
    var gr = new GlideRecord('sys_user_grmember');
    gr.addQuery('user', userID);
    gr.query();
    while (gr.next()) {
        //gs.addInfoMessage(userID.user_name + " is member of " + gr.group);
        if (gr.group == 'ddf3d1dedb4f20d0b56645403996196c') //Approving Manager = ddf3d1dedb4f20d0b56645403996196c
        {
            return true;
        }
    }
    return false;
}

When you test whether gr.manager is in the array, use gr.manager.getUniqueValue() so that you're looking for a string in an array of strings. gr.manager is an object so it wouldn't be found in the checkManagers array.

Ok, I see why, so I changed code to:

if (checkedManagers.indexOf(gr.manager.getUniqueValue()) == -1) {
			gs.addInfoMessage(gr.manager + " was NOT yet checked: " +checkedManagers.indexOf(gr.manager.getUniqueValue()));
			gs.addInfoMessage("checkedManagers: " + checkedManagers.toString());

But, result seems to be the same:-/

2e7e51fcdb69470018aa9ee3db9619d8 was NOT yet checked: -1
checkedManagers: 00b0d9a1db761f80ba3f92b8db9619cf,c70fd9ecdb254700fd889414db961985,413539c0dbff2b40ba3f92b8db9619c9,0d9f1ae1dbd01410e98c6d6bd39619fb,2e7e51fcdb69470018aa9ee3db9619d8,2e7e51fcdb69470018aa9ee3db9619d8,2e7e51fcdb69470018aa9ee3db9619d8,2e7e51fcdb69470018aa9ee3db9619d8