如何使用JavaScript按键和值映射对象? [英] How to map an object as per key and value using JavaScript?

查看:74
本文介绍了如何使用JavaScript按键和值映射对象?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想通过对象键对对象数组进行分组,然后根据该分组创建一个新的对象数组。我在下面显示我的对象。

I want to group an array of objects by an object key then create a new array of objects based on the grouping. I am showing my object below.

var oldArr=[
            {
          "_id":"5c407834953d7f420d56f866",
          "allocated_to":"FIELD",
          "zone":"NORTH",
          "state":"DELHI",
          "location":"NEW DELHI",
          "customer_name":"REET INFOTECH",
          "bank_name_of_customer":"YES BANK",
          "cl_contract_id":"LAI-00016881",
          "lk_loan_account_id":"LK0000015094",
          "front_end_manager_name":"SONAL",
          "area_collection_manager":"ASHIS JENA",
          "installment_date":"",
          "collection_manager":"",
        },
        {
          "_id":"5c407834953d7f420d56f867",
          "allocated_to":"FIELD",
          "zone":"NORTH",
          "state":"DELHI",
          "location":"Sree Nagar",
          "customer_name":"REET",
          "bank_name_of_customer":"Corporate BANK",
          "cl_contract_id":"LAI-00016881",
          "lk_loan_account_id":"LK0000015094",
          "front_end_manager_name":"SONAL",
          "area_collection_manager":"ASHIS JENA",
          "installment_date":"",
          "collection_manager":"",
        },
        {
          "_id":"5c407834953d7f420d56f868",
          "allocated_to":"FIELD",
          "zone":"EAST",
          "state":"Odisha",
          "location":"Bhubaneswar",
          "customer_name":"REET",
          "bank_name_of_customer":"PNB BANK",
          "cl_contract_id":"LAI-00016881",
          "lk_loan_account_id":"LK0000015094",
          "front_end_manager_name":"SONAL",
          "area_collection_manager":"ASHIS JENA",
          "installment_date":"",
          "collection_manager":"",
        },
        {
          "_id":"5c407834953d7f420d56f890",
          "allocated_to":"FIELD",
          "zone":"EAST",
          "state":"Assam",
          "location":"Gawhati",
          "customer_name":"REET",
          "bank_name_of_customer":"SBI BANK",
          "cl_contract_id":"LAI-00016881",
          "lk_loan_account_id":"LK0000015094",
          "front_end_manager_name":"SONAL",
          "area_collection_manager":"ASHIS JENA",
          "installment_date":"",
          "collection_manager":"",
        }
]

我需要制作一个新的数组,该数组应该按 zone,state,location 进行分组,格式如下。 / p>

I need to make new array which should be group by zone,state,location and format is given below.

 newdata={
          zone_list: [{
            zone: NORTH,
            state_list: [{    
              state: DELHI,
              location_list: [{
                location: NEW DELHI,
                task_list: [{
                  user_pkId: 5c407834953d7f420d56f866,
                  front_end_manager_name: SONAL,
                  collection_manager: "",
                  area_collection_manager: ASHIS JENA,
                  loan_accounts_assigned: [{
                    allocated_to: FIELD,
                    lk_loan_account_id: LK0000015094,
                    cl_contract_id: LAI-00016881,
                    customer_name: REET INFOTECH,
                    customer_bank_name: YES BANK,
                  }]
                }]
              }]
            },{
              state: JK,
              location_list: [{
                location: Sree Nagar,
                task_list: [{
                  user_pkId: 5c407834953d7f420d56f867,
                  front_end_manager_name: SONAL,
                  collection_manager: "",
                  area_collection_manager: ASHIS JENA,
                  loan_accounts_assigned: [{
                    allocated_to: FIELD,
                    lk_loan_account_id: LK0000015094,
                    cl_contract_id: LAI-00016881,
                    customer_name: REET INFOTECH,
                    customer_bank_name: Corporate BANK,
                  }]
                }]
              }]
            }]
          },{
            zone: EAST,
            state_list: [{    
              state: Odisha,
              location_list: [{
                location: Bhubaneswar,
                task_list: [{
                  user_pkId: 5c407834953d7f420d56f868,
                  front_end_manager_name: SONAL,
                  collection_manager: "",
                  area_collection_manager: ASHIS JENA,
                  loan_accounts_assigned: [{
                    allocated_to: FIELD,
                    lk_loan_account_id: LK0000015094,
                    cl_contract_id: LAI-00016881,
                    customer_name: REET INFOTECH,
                    customer_bank_name: SBI BANK,
                  }]
                }]
              }]
            }]
          }]
        }

我在下面提供我的代码。

I am providing my code below.

var zonelist=[];
var statelist=[];
 var locationlist=[];
var tasklist=[];
var loanarr=[];
var finalArr=[];
for(var i=0;i<dataArr.length;i++){
          if (zonelist.length > 0) {
            var hasZone=false;
            var zoneindex='';
            for(var j=0;j<zonelist.length;j++){
              if (dataArr[i]['zone']==zonelist[j]['zone']) {
                hasZone=true;
                zoneindex=j;
                break;
              }
            }
            if (hasZone==true) {
              var hasState=false;
              var stateindex='';
              for(var k=0;k<zonelist[zoneindex]['state_list'].length;k++){
                if (dataArr[i]['state']==zonelist[zoneindex]['state_list'][k]['state']) {
                  hasState=true;
                  stateindex=k;
                }
              }
              if (hasState==true) {
                var haslocation=false;
                var locindex='';
                for(var l=0;l<zonelist[zoneindex]['state_list'][stateindex]['location_list'].length;l++){
                  if (dataArr[i]['location']==zonelist[zoneindex]['state_list'][stateindex]['location_list'][l]['location']) {
                    haslocation=true;
                    locindex=l;
                  }
                }
                if (haslocation==true) {
                  var hasUser=false;
                  var userindex='';

                }else{
                  var dataloan={'allocated_to':dataArr[i]['allocated_to'],'lk_loan_account_id':dataArr[i]['lk_loan_account_id'],'cl_contract_id':dataArr[i]['cl_contract_id'],'customer_name':dataArr[i]['customer_name'],'customer_bank_name':dataArr[i]['bank_name_of_customer']};
                  loanarr.push(datatask);
                  var datatask={'user_pkId':dataArr[i]['_id'],'front_end_manager_name':dataArr[i]['front_end_manager_name'],'collection_manager':dataArr[i]['collection_manager'],'area_collection_manager':dataArr[i]['area_collection_manager'],'loan_accounts_assigned':loanarr};
                  tasklist.push(datatask);
                  var dataloc={'location':dataArr[i]['location'],'task_list':tasklist};
                  locationlist.push(dataloc);
                }
              }else{
                var dataloan={'allocated_to':dataArr[i]['allocated_to'],'lk_loan_account_id':dataArr[i]['lk_loan_account_id'],'cl_contract_id':dataArr[i]['cl_contract_id'],'customer_name':dataArr[i]['customer_name'],'customer_bank_name':dataArr[i]['bank_name_of_customer']};
                loanarr.push(datatask);
                var datatask={'user_pkId':dataArr[i]['_id'],'front_end_manager_name':dataArr[i]['front_end_manager_name'],'collection_manager':dataArr[i]['collection_manager'],'area_collection_manager':dataArr[i]['area_collection_manager'],'loan_accounts_assigned':loanarr};
                tasklist.push(datatask);
                var dataloc={'location':dataArr[i]['location'],'task_list':tasklist};
                locationlist.push(dataloc);
                var datastate={'state':dataArr[i]['state'],'location_list':locationlist};
                statelist.push(datastate);
              }
            }else{
              var dataloan={'allocated_to':dataArr[i]['allocated_to'],'lk_loan_account_id':dataArr[i]['lk_loan_account_id'],'cl_contract_id':dataArr[i]['cl_contract_id'],'customer_name':dataArr[i]['customer_name'],'customer_bank_name':dataArr[i]['bank_name_of_customer']};
                loanarr.push(datatask);
              var datatask={'user_pkId':dataArr[i]['_id'],'front_end_manager_name':dataArr[i]['front_end_manager_name'],'collection_manager':dataArr[i]['collection_manager'],'area_collection_manager':dataArr[i]['area_collection_manager'],'loan_accounts_assigned':loanarr};
                tasklist.push(datatask);
              var dataloc={'location':dataArr[i]['location'],'task_list':tasklist};
              locationlist.push(dataloc);
              var datastate={'state':dataArr[i]['state'],'location_list':locationlist};
              statelist.push(datastate);
              var datazone={'zone':dataArr[i]['zone'],'state_list':statelist};
              zonelist.push(datazone);
            }
          }else{
            var dataloan={'allocated_to':dataArr[i]['allocated_to'],'lk_loan_account_id':dataArr[i]['lk_loan_account_id'],'cl_contract_id':dataArr[i]['cl_contract_id'],'customer_name':dataArr[i]['customer_name'],'customer_bank_name':dataArr[i]['bank_name_of_customer']};
            loanarr.push(dataloan);
            var datatask={'user_pkId':dataArr[i]['_id'],'front_end_manager_name':dataArr[i]['front_end_manager_name'],'collection_manager':dataArr[i]['collection_manager'],'area_collection_manager':dataArr[i]['area_collection_manager'],'loan_accounts_assigned':loanarr};
            tasklist.push(datatask);
            var dataloc={'location':dataArr[i]['location'],'task_list':tasklist};
            locationlist.push(dataloc);
            var datastate={'state':dataArr[i]['state'],'location_list':locationlist};
            statelist.push(datastate);
            var datazone={'zone':dataArr[i]['zone'],'state_list':statelist};
            zonelist.push(datazone);
          }
        }
        var findata={'zone_list':zonelist};
        console.log('finaldata',findata);

但是上面的代码没有给出预期的输出。

But above code did not give the expected output.

推荐答案

您可以为所需的组和相关键采用数组,并采用迭代和递归的方法。

You could take an array for the wanted groups and related keys and take an iterative and recursive approach.

var data = [{ _id: "5c407834953d7f420d56f866", allocated_to: "FIELD", zone: "NORTH", state: "DELHI", location: "NEW DELHI", customer_name: "REET INFOTECH", bank_name_of_customer: "YES BANK", cl_contract_id: "LAI-00016881", lk_loan_account_id: "LK0000015094", front_end_manager_name: "SONAL", area_collection_manager: "ASHIS JENA", installment_date: "", collection_manager: "" }, { _id: "5c407834953d7f420d56f867", allocated_to: "FIELD", zone: "NORTH", state: "DELHI", location: "Sree Nagar", customer_name: "REET", bank_name_of_customer: "Corporate BANK", cl_contract_id: "LAI-00016881", lk_loan_account_id: "LK0000015094", front_end_manager_name: "SONAL", area_collection_manager: "ASHIS JENA", installment_date: "", collection_manager: "" }, { _id: "5c407834953d7f420d56f868", allocated_to: "FIELD", zone: "EAST", state: "Odisha", location: "Bhubaneswar", customer_name: "REET", bank_name_of_customer: "PNB BANK", cl_contract_id: "LAI-00016881", lk_loan_account_id: "LK0000015094", front_end_manager_name: "SONAL", area_collection_manager: "ASHIS JENA", installment_date: "", collection_manager: "" }, { _id: "5c407834953d7f420d56f890", allocated_to: "FIELD", zone: "EAST", state: "Assam", location: "Gawhati", customer_name: "REET", bank_name_of_customer: "SBI BANK", cl_contract_id: "LAI-00016881", lk_loan_account_id: "LK0000015094", front_end_manager_name: "SONAL", area_collection_manager: "ASHIS JENA", installment_date: "", collection_manager: "" }],
    groups = [
        ['zone_list', 'zone'],
        ['state_list', 'state'],
        ['location_list', 'location'],
        ['task_list', '_id', 'front_end_manager_name', 'area_collection_manager', 'collection_manager'],
        ['loan_accounts_assigned', 'lk_loan_account_id', 'allocated_to', 'cl_contract_id', 'customer_name', 'bank_name_of_customer']
    ],
    result = data.reduce((r, o) => {
        groups.reduce((t, [group, ...keys]) => {
            var temp = (t[group] = t[group] || []).find(p => o[keys[0]] === p[keys[0]]);
            if (!temp) {
                temp = Object.assign({}, ...keys.map(k => ({ [k]: o[k] })));
                t[group].push(temp);
            }
            return temp;
        }, r);
        return r;
    }, {});
console.log(result);

.as-console-wrapper { max-height: 100% !important; top: 0; }

这篇关于如何使用JavaScript按键和值映射对象?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆