2017-07-28 307 views
3

數組我有這樣的:JS轉換嵌套對象爲對象

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}, 
      ... 
    ]; 
+0

什麼是你目前執行的問題? –

+0

我會推薦使用'reduce'。 – evolutionxbox

+0

我不知道如何通過dataSet,並獲得每個部門分開的數組(高,中,低)。在我的一次嘗試中,我只獲得了聚合數組(所有部門在一起)。 – Dubliner

回答

0

您可以使用該組的部門數組和哈希表。

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

+0

謝謝@Nina! – Dubliner

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

+0

謝謝@曲球。 – Dubliner

0

你好這裏是我對你的工作解決方案。

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" } 
 
       ] 
 
      } 
 
    \t ] 
 
    } 
 
    } 
 
    
 
    var employeenumber = 1; 
 
    var Low = 0; 
 
    var Medium = 0; 
 
    var High = 0; 
 
    var data = []; 
 
    var i = 0; 
 
    for (var departments in dataSet.data) { 
 
    \t //console.log(JSON.stringify(dataSet.data[departments])); 
 
    \t for (var arrays in dataSet.data[departments]) { 
 
    \t \t //console.log(dataSet.data[departments][arrays]); 
 
    \t \t var department = dataSet.data[departments][arrays]; 
 
    \t \t for (var employees in department) { 
 
    \t \t \t //console.log(JSON.stringify(department[employees])); 
 
    \t \t \t var employeesArray = department[employees]; 
 
    \t \t \t for (employee in employeesArray) { 
 
    
 
    \t \t \t \t var employeeScoreObject = employeesArray[employee]; 
 
    \t \t \t \t var employee_score = employeeScoreObject["employee_"+employeenumber]; 
 
    \t \t \t \t //console.log(employee_score); 
 
    \t \t \t \t if (employee_score < 2000) { 
 
    \t \t \t \t \t Low++; 
 
    \t \t \t \t } 
 
    \t \t \t \t if (employee_score >= 2000 && employee_score < 5000) { 
 
    \t \t \t \t \t Medium++; 
 
    \t \t \t \t } 
 
    \t \t \t \t if (employee_score > 5000) { 
 
    \t \t \t \t \t High++; 
 
    \t \t \t \t } 
 
    \t \t \t \t employeenumber++; 
 
    \t \t \t \t if (employeenumber>4) { 
 
    \t \t \t \t employeenumber = 1; 
 
    \t \t \t \t } 
 
    \t \t \t } 
 
    \t \t \t var departmentName = Object.keys(department)[0]; 
 
    
 
    \t \t \t data[i] = {'name': departmentName, 'Low': Low, 'Medium': Medium, 'High': High}; 
 
    \t \t \t i++; 
 
    
 
    \t \t \t Low = 0; 
 
    \t \t \t Medium = 0; 
 
    \t \t \t High = 0; 
 
    \t \t } // employees 
 
    \t \t 
 
    \t } // department 1= marketing 2 =.... 
 
    \t 
 
    } // departments 
 
    console.log(JSON.stringify(data));

+0

謝謝@Henrikki! – Dubliner