Как найти рекурсивного родителя в машинописи - PullRequest
0 голосов
/ 25 сентября 2019

Объект JSON сотрудника

var sampleObject = [
    {
      employeeId: 1,
      employeeName: 'E1',
      managerId: null
    }, {
      employeeId: 2,
      employeeName: 'E2',
      managerId: 1
    }, {
      employeeId: 3,
      employeeName: 'E3',
      managerId: 1
    }, {
      employeeId: 4,
      employeeName: 'E4',
      managerId: 3
    }
]

В машинописном тексте как найти идентификатор рекурсивного менеджера до самого верха, пока менеджер не станет нулевым.

Предположим, здесь я хочу найти верхнююСамый менеджер E4.

Как этого добиться.Пожалуйста, предложите.Благодарю.

Ответы [ 4 ]

3 голосов
/ 25 сентября 2019

Вы можете использовать итеративный подход к объекту для отношений имя / идентификатор и отношения идентификатор / менеджер.

function getTop(name) {
    var top,
        id = staff.name[name];

    while (top = staff.manager[id]) id = top;

    return id;
}

var array = [{ employeeId: 1, employeeName: 'E1', managerId: null }, { employeeId: 2, employeeName: 'E2', managerId: 1 }, { employeeId: 3, employeeName: 'E3', managerId: 1 }, { employeeId: 4, employeeName: 'E4', managerId: 3 }],
    staff = array.reduce((r, { employeeId, employeeName, managerId }) => {
        r.name[employeeName] = employeeId;
        r.manager[employeeId] = managerId;
        return r;
    }, { manager: {}, name: {} });
    
console.log(getTop('E4'))
3 голосов
/ 25 сентября 2019
const sampleObject = [
    {
      employeeId: 1,
      employeeName: 'E1',
      managerId: null
    }, {
      employeeId: 2,
      employeeName: 'E2',
      managerId: 1
    }, {
      employeeId: 3,
      employeeName: 'E3',
      managerId: 1
    }, {
      employeeId: 4,
      employeeName: 'E4',
      managerId: 3
    }
]

function getRootManager(id: number, fined: number[] = []): number {
  const employee = sampleObject.find(e => e.employeeId === id);

  // Prevent 'Maximum call stack size exceeded'
  if (fined.indexOf(employee.managerId) !== -1) {
    return employee.employeeId;
  }

  if (employee.managerId !== null) {
    return getRootManager(employee.managerId, [...fined, employee.managerId])
  } else {
    return employee.employeeId;
  }
}

console.log(getRootManager(4))
2 голосов
/ 25 сентября 2019

Обычно я бы попросил вас добавить вашу попытку, но мне очень нравится выполнять рекурсивные функции, так как это не часто встречается в моей повседневной работе.Я не добавил в атрибуты Typescript, потому что я чувствую, что добавить тип параметра и тип возвращаемого значения должно быть относительно просто, как только вы сделаете тип для Employee.

function findHighest(employee) {
    const managerId = employee.managerId;

    if(managerId) {
        const managerObject = sampleObject.find(sample => sample.employeeId === managerId);
        return findHighest(managerObject);
    }

    return employee;
}

Эта функция будетобъект сотрудника, найдите его managerId, если у него есть managerId, он находит соответствующий объект сотрудника для этого менеджера и передает его обратно в себя.В противном случае, если не найдено managerId, он вернет объект employee (который будет объектом менеджера верхнего уровня, а не id, потому что managerId всегда будет нулевым).

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

1 голос
/ 25 сентября 2019

var sampleObject = [{
    'employeeId': 1,
    employeeName: 'E1',
    managerId: null
  },
  {
    employeeId: 2,
    employeeName: 'E2',
    managerId: 1
  },
  {
    employeeId: 3,
    employeeName: 'E3',
    managerId: 1
  },
  {
    employeeId: 4,
    employeeName: 'E4',
    managerId: 3
  }
];


let findHierarchy = (emp) => {
  let manager = null;

  if (emp.managerId) {
    var managerObj = sampleObject.find((o) => o.employeeId === emp.managerId);
    manager = findHierarchy(managerObj);
  }

  emp.manager = manager;

  return emp;
}

let e = {
  employeeId: 4,
  employeeName: 'E4',
  managerId: 3
};

let output = findHierarchy(e);

console.log(output);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...