0

我有一个代表国家的对象列表。

每个国家都有很多员工。每个员工对象都有自己的属性和对其经理的引用。

员工可以有一个不存在的经理或坐在不同国家的经理。

我正在尝试用员工和经理之间的父子关系重建一个新对象。

var Markets = {
"CH":{
        "Resources": {
            "user1": {"First name": "John", "Last name": "Blue", "Job Title": "Job 1", "Email": "john@email", "Manager": ""},               
            "user2": {"First name": "Bob", "Last name": "Black", "Job Title": "Job 2", "Email": "bob@email", "Manager": "user1"},
            "user3": {"First name": "Joe", "Last name": "Brown", "Job Title": "Job 3", "Email": "joe@email", "Manager": "user1"},
            "user4": {"First name": "Jack", "Last name": "White", "Job Title": "Job 4", "Email": "jack@email", "Manager": "user2"}
            "user5": {"First name": "Jess", "Last name": "Red", "Job Title": "Job 5", "Email": "jess@email", "Manager": ""}
        }
    }

因此,我的新对象看起来像:

user 1
    user 2
    user 3
        user 4
user 5

我想出了以下功能,但我很难让它递归以确保它将二级经理重新分配到一级。

function countryOrgChart(market) {
    var orgChartData = {};
    for (var resource in window['Markets'][market]['Resources']) {
        orgChartData[resource] = [];
    }
    orgCharDataTmp = orgChartData;
    for (var resource in orgCharDataTmp {
        var manager = window['Markets'][market]['Resources'][resource]['Manager'];
        if (manager in orgChartData) { 
            orgChartData[manager].push(resource); 
            delete orgChartData[resource]; 
        }
    }
    return(orgChartData);

}

4

1 回答 1

0

It does not need to be recursive to create it, just to navigate over it after creation.

  • Create a look-up of all the users
  • Attach employees to managers based on the manager user id
  • Display recursively

http://jsfiddle.net/TrueBlueAussie/orbp4w3n/5/

// Build a dictionary of all employees
var emps = [];

// Iterate the markets
for (var marketkey in Markets) {
    var market = Markets[marketkey];

    // Iterate the departments in a market
    for (var departmentkey in market) {
        var department = market[departmentkey];

        // Iterate the employess in a department
        for (var employeekey in department) {

            // Store the required employee details in an array
            var employee = department[employeekey];
            console.log(employee);
            emps.push({
                user: employeekey,
                manager: employee.Manager,
                employees: []
            });
        }
    }
}

// Also build a list of all employees with no manager
var directors = [];

// Connect the employee to their manager
for (var i = 0; i < emps.length; i++) {
    var employee = emps[i];

    // if the employee has a manager
    if (employee.manager) {

        // Find the manager object
        var mgr = $.grep(emps, function (e) {
            return e.user == employee.manager;
        });
        if (mgr.length) {
            var manager = mgr[0];

            // if found add this employee to their list of employees
            manager.employees.push(employee);

            // get rid of the reference
            delete employee.manager;
        }
    } else {
        directors.push(employee);
    }
}

Note: I have not reduced the code, as I am aiming for readability.

于 2014-10-24T10:27:40.210 回答