0
votes

Comment trouver le parent récursif dans TypeScript

Objet JSON Employé

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
    }
]


5 commentaires

Votre question n'est pas claire pouvez-vous le raffiner. Qu'entendez-vous par "Top Très Manager de E4"


S'il vous plaît ajoutez votre essai.


" JSON Object " - Donc, un objet JavaScript? Json = chaîne


Voulez-vous retourner le plus grand parent (gestionnaire le plus élevé) ou voulez-vous l'architecture hiérarchique?


Ce Json n'a pas de parents, seulement des frères et sœurs. Et que voulez-vous dire par "le sommet"?


4 Réponses :


3
votes
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))

0 commentaires

1
votes

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);


0 commentaires

3
votes

Vous pouvez adopter une approche itérative avec un objet pour les relations Nom / ID et les relations d'identité / ID / Manager.

p>

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'))


0 commentaires

2
votes

Normalement, je vous demanderais d'ajouter votre tentative, mais j'aime bien faire des fonctions récursives car elle ne vient pas très souvent dans mon travail de jour. Je n'ai pas ajouté dans les attributs dossiers, car je me sens comme si cela devrait être relativement simple pour ajouter un type de paramètre et un type de retour une fois que vous avez créé un type pour employé code>.

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

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

    return employee;
}


0 commentaires