【问题标题】:JS converting nested objects into an array of objectsJS将嵌套对象转换为对象数组
【发布时间】:2018-01-04 06:25:09
【问题描述】:

我有这个:

var dataSet = { 
data: {
    department: [
        { 
          "Marketing": [
            { "employee_1": "1210" },
            { "employee_2": "3241" },
            { "employee_3": "6510" },
            { "employee_4": "9510" }

          ]
        },
        { 
          "Sales": [
          { "employee_1": "5210" },
          { "employee_2": "1241" },
          { "employee_3": "8510" },
          { "employee_4": "2510" }
          ]
        },
        { 
          "RD": [
          { "employee_1": "1010" },
          { "employee_2": "9241" },
          { "employee_3": "9430" },
          { "employee_4": "3510" }
          ]
        },
        ...
    ]
}

}

我需要这个:

const data = [
          {name: 'Marketing', Low: 2, Medium: 4, High: 3},
          {name: 'Sales', Low: 3, Medium: 1, High: 5},
          {name: 'RD', Low: 6, Medium: 1, High: 2},
          ...
    ];

地点:

LOW     employee_x < 2000 
MEDIUM  employee_x >= 2000 && employee_x < 5000
HIGH    employee_x >= 5000

我的最后一次尝试是这样的:

    var low_arr_dept = [];
    var medium_arr_dept = [];
    var high_arr_dept = [];

    for (var i in dataSet.data) {
                var department = departments_data[i];

                        for (var d in department) {
                            var score = department[d];
                            for (var j in score) {

                                if (Object.values(department[d][j]) >= 5000) {
                                    console.log("Object.values(department[d][j]) ", Object.values(department[d][j]))
                                    low_arr_dept.push({

                                        score: Object.values(department[d][j])
                                    });
                                } else if (Object.values(department[d][j]) >= 2000 && Object.values(department[d][j]) < 5000) {
                                    medium_arr_dept.push({

                                        score: Object.values(department[d][j])
                                    });
                                } else if (Object.values(department[d][j])  <2000) {
                                    high_arr_dept.push({

                                        score: Object.values(department[d][j])
                                    });
                                }


                            } 
                        }

            }



            // Creating arrays and then getting their length
            low_arr_dept_marketing.length.toString()
            medium_arr_dept_marketing.length.toString()
            high_arr_dept_marketing.length.toString()

// For creating this:
const data = [
          {name: 'Marketing', Low: low_arr_dept_marketing.length, Medium: medium_arr_dept_marketing.length, High: high_arr_dept_marketing.length},
          {name: 'Sales', Low: low_arr_dept_sales.length, Medium: medium_arr_dept_sales.length, High: high_arr_dept_sales.length},
          {name: 'RD'Low: low_arr_dept_rd.length, Medium: medium_arr_dept_rd.length, High: high_arr_dept_rd.length},
          ...
    ];

【问题讨论】:

  • 您当前的实现有什么问题?
  • 我建议使用reduce
  • 我不知道如何通过数据集并为每个部门获取分离的数组(高、中、低)。在我的一次尝试中,我只得到聚合数组(所有部门一起)。

标签: javascript loops object


【解决方案1】:

可能不是最好的方法,虽然代码很短,但我根据你说的需要得到了你需要的。看看吧。

var data = { 
data: {
    department: [
        { 
          "Marketing": [
            { "employee_1": "1210" },
            { "employee_2": "241" },
            { "employee_3": "6510" },
            { "employee_4": "9510" }

          ]
        },
        { 
          "Sales": [
          { "employee_1": "5210" },
          { "employee_2": "1241" },
          { "employee_3": "8510" },
          { "employee_4": "2510" }
          ]
        },
        { 
          "RD": [
          { "employee_1": "1010" },
          { "employee_2": "9241" },
          { "employee_3": "9430" },
          { "employee_4": "3510" }
          ]
        }
    ]
}
};

var new_data = data.data.department.map(function(el, ind) {
    var item = {low: 0, medium: 0, high: 0};
    // set the name of department for new array
    for(var prop in el) item.name = prop; 
    // go and check ids increasing counters
    for(var i = 0; i < el[prop].length; i++) for(var prop2 in el[prop][i]) if(el[prop][i][prop2] < 2000) item.low++; else if(el[prop][i][prop2] >= 5000) item.high++; else item.medium++;  return item;
});

console.log(new_data);

【讨论】:

  • 谢谢@curveball。
【解决方案2】:

您可以对组使用数组,对部门使用哈希表。

var dataSet = { data: { department: [{ Marketing: [{ employee_1: "1210" }, { employee_2: "3241" }, { employee_3: "6510" }, { employee_4: "9510" }] }, { Sales: [{ employee_1: "5210" }, { employee_2: "1241" }, { employee_3: "8510" }, { employee_4: "2510" }] }, { RD: [{ employee_1: "1010" }, { employee_2: "9241" }, { employee_3: "9430" }, { employee_4: "3510" }] }] } },
    groups = [{ key: 'LOW', value: 2000 }, { key: 'MEDIUM', value: 5000 }, { key: 'HIGH', value: Infinity }],            
    hash = {},
    result = [];

dataSet.data.department.forEach(function (o) {
    var dept = Object.keys(o)[0];
    o[dept].forEach(function (p) {
        var value = p[Object.keys(p)[0]],
            group = groups.find(g => +value < g.value).key;

        if (!hash[dept]) {
            hash[dept] = { name: dept };
            groups.forEach(g => hash[dept][g.key] = 0);
            result.push(hash[dept]);
        }
        hash[dept][group]++;
    });
});
    
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

    【解决方案3】:

    您好,这是我为您准备的解决方案。

    var dataSet = { 
        data: {
            department: [
                { 
                  "Marketing": [
                    { "employee_1": "1210" },
                    { "employee_2": "3241" },
                    { "employee_3": "6510" },
                    { "employee_4": "9510" }
        
                  ]
                },
                { 
                  "Sales": [
                  { "employee_1": "5210" },
                  { "employee_2": "1241" },
                  { "employee_3": "8510" },
                  { "employee_4": "2510" }
                  ]
                },
                { 
                  "RD": [
                  { "employee_1": "1010" },
                  { "employee_2": "9241" },
                  { "employee_3": "9430" },
                  { "employee_4": "3510" }
                  ]
                }
        	]
        }
        }
        
        var employeenumber = 1;
        var Low = 0;
        var Medium = 0;
        var High = 0;
        var data = [];
        var i = 0;
        for (var departments in dataSet.data) {
        	//console.log(JSON.stringify(dataSet.data[departments])); 
        	for (var arrays in dataSet.data[departments]) {
        		//console.log(dataSet.data[departments][arrays]);
        		var department = dataSet.data[departments][arrays];
        		for (var employees in department) {
        			//console.log(JSON.stringify(department[employees]));
        			var employeesArray = department[employees];
        			for (employee in employeesArray) {
        
        				var employeeScoreObject = employeesArray[employee];
        				var employee_score = employeeScoreObject["employee_"+employeenumber];
        				//console.log(employee_score);
        				if (employee_score < 2000) {
        					Low++;
        				}
        				if (employee_score >= 2000 && employee_score < 5000) {
        					Medium++;
        				}
        				if (employee_score > 5000) {
        					High++;
        				}
        				employeenumber++;
        				if (employeenumber>4) {
        				employeenumber = 1;
        				}
        			}
        			var departmentName = Object.keys(department)[0];
        
        			data[i] = {'name': departmentName, 'Low': Low, 'Medium': Medium, 'High': High};
        			i++;
        
        			Low = 0;
        			Medium = 0;
        			High = 0;
        		} // employees
        		
        	} // department 1= marketing 2 =....
        	
        } // departments
        console.log(JSON.stringify(data));

    【讨论】:

    • 谢谢@Henrikki!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    • 2015-03-26
    • 2019-01-31
    相关资源
    最近更新 更多