Динамический цикл, переменные обхода точек каждый раз через цикл - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть сценарий, который требует, чтобы переменная точка проходила, если критерии не выполнены.

Каждый пользователь назначается в «Отдел» в своей записи.Наш отдел имеет древовидную структуру, поэтому отдел, на который назначен пользователь, может находиться на нескольких уровнях от общего «родительского» отдела.Мой сценарий должен занять отдел пользователей, а затем взобраться на дерево, чтобы увидеть, является ли он частью определенного общего «родительского» отдела.Если есть совпадение, мне нужно разорвать петлю и отобразить отдел, в противном случае ему нужно взобраться на дерево.Если он достигает вершины дерева и совпадений нет, тогда я использую оригинальное название отдела.

В моем текущем коде я могу учесть 3 уровня глубины, но может возникнуть необходимость динамически выглядеть намного ниже.

var dept1 = new DepartmentUtils().getParentDepartment(current.department.sys_id);
var dept2 = new DepartmentUtils().getParentDepartment(current.department.parent.parent.sys_id);
var dept3 = new DepartmentUtils().getParentDepartment(current.department.parent.parent.parent.sys_id);

if(!JSUtil.nil(dept1))
{
    retVal = dept1;
}
else if(!JSUtil.nil(dept2))
{
    retVal = dept2;
}
else if(!JSUtil.nil(dept3))
{
    retVal = dept3;
}
else
{
    retVal = current.department.name;
}

По сути, я подумал, что мне нужно начать с текущего уровня отдела, посмотреть, если это конкретное имя, если нет, то посмотреть на его родительское имя, сравнить его, а затем повторять, пока ядостичь вершины (там, где родитель пуст).

Моя проблема в том, что я не знаю, как справиться с точечной ходьбой.Я пытался использовать команду .parent .repeat (x), но я не уверен, что это правильный маршрут.

Есть идеи?

Ответы [ 3 ]

0 голосов
/ 12 февраля 2019

Я предполагаю, что у вас есть структура данных примерно такая

var current = {
    department: {
        parent: {
            sys_id: "parent_1",
            parent: {
                sys_id: "parent_2",
                parent: {
                    sys_id: "parent_3",
                    parent: {
                        sys_id: "parent_4"
                    }
                }
            }
        }
    }
}

Вы можете определить рекурсивную функцию для поиска данных в дереве.

function searchParentDepartment(target_sys_id, fromDepartment){

    //Found matched department
    if(fromDepartment.sys_id === target_sys_id) return fromDepartment;

    if(!!fromDepartment.parent){
        //Has parent, search parent recursively
        return searchParentDepartment(target_sys_id, fromDepartment.parent);
    }else{
        //No parent return null
        return null;
    }
}

var resultDepartment = searchParentDepartment(target_sys_id, current.department);

if(resultDepartment == null){
    resultDepartment = current.department;
}
0 голосов
/ 14 февраля 2019

Я на самом деле пытался другой подход, и, похоже, работает.Я создал функцию, которая должна проходить каждый раз, чтобы проверить, соответствует ли текущий sys_id одному из 3 конкретных sys_ids.Если это так, отобразите это имя, в противном случае проверьте родительский элемент и т. Д.

var dept1 = new DepartmentUtils().getParent(current.department.sys_id);

getParent: function(request)
{
    var parent_name = '';
    var current_name = request;
    var lookup= new GlideRecord('cmn_department');

    lookup.addQuery('sys_id', current_name);
    lookup.query();
    if(lookup.next())
    {

        if(lookup.sys_id == 'xxxxxxx' || lookup.sys_id == 'yyyyyyyy' || lookup.sys_id == 'zzzzzzzzzz')
        {
            return current_name;
        }
        else{

            current_name = lookup.parent.sys_id;
            parent_name = getParent(current_name); // this is recursive functionality the function will get call until last most parent record find        
        }
    }
    if(!JSUtil.nil(parent_name))
    {
        return parent_name; // It will return most parent record
    }
    else
    {
        return current_name; // If we don't have any parent it will return what you passed in parameter above to call function
    }
},
0 голосов
/ 12 февраля 2019

Вы можете использовать цикл для многократного доступа к свойству .parent отдела.Если на этом уровне ничего не найдено, переназначьте department на следующий .parent:

let { department } = current;
while (department) {
  const { sys_id } = department;
  if (!JSUtil.nil(sys_id)) {
    return sys_id;
  }
  department = department.parent;
}
// the above loop will exit once no more nested `.parent` property exists
// so, return the original department name:
return current.department.name;
...