【问题标题】:Jquery Recursive Object Iteration to build OrgchartJquery 递归对象迭代构建 Orgchart
【发布时间】:2014-10-24 09:12:55
【问题描述】:

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

每个国家/地区都有一定数量的员工。 每个员工对象都有自己的属性和对其经理的引用。

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

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

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

}

【问题讨论】:

  • 你能预测经理会在他们管理的员工之前被定义吗?这将改变它的完成方式。

标签: jquery object recursion orgchart


【解决方案1】:

创建它不需要递归,只需在创建后导航即可。

  • 创建所有用户的查找
  • 根据经理用户 ID 将员工附加到经理
  • 递归显示

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

注意: 我没有减少代码,因为我的目标是可读性。

【讨论】:

    猜你喜欢
    • 2011-01-13
    • 2015-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-02
    • 2019-10-26
    • 1970-01-01
    • 2015-01-14
    相关资源
    最近更新 更多