簡體   English   中英

使用reduce函數將數組匯總為對象

[英]summarize array to an Object using reduce function

我的任務是總結超過 500 個其他數組的數組。 這是var list的一些條目的示例

var list = [
  [
    "MIKE",               //employee first
    "NGUYEN",             //employee last
    123,                  //id
    "Sandra M.",          //supervisor name 
    "sandra.m@email.com"  //supervisor email
  ],
  [
    "MYA",
    "LANE",
    456,
    "John A",
    "john.a@email.com"
  ],
  [
    "RON",
    "MASTER",
    789,
    "John A",
    "john.a@email.com"
  ],
  [
    "MIKE",
    "NGUYEN",
    123,
    "Sandra M.",
    "sandra.m@email.com"
  ],
  [
    "MYA",
    "LANE",
    456,
    "john A",
    "john.a@email.com"
  ],
  [
    "ROBERT",
    "RULES",
    100,
    "Sandra M.",
    "sandra.m@email.com"
  ],
  [
    "ROBERT",
    "RULES",
    100,
    "Sandra M.",
    "sandra.m@email.com"
  ]
]

我認為這將是 reduce 函數的一個很好的候選者,但我找不到正確使用它的方法。

我想創建一個簡單的{}數組,將數據匯總為以下內容:

var result = [
{
  supervisor: "Sandra M.",   //supervisor name   
  email: sandra.a@email.com, //supervisor email
  employees: 2,              //number of employees supervised by Sandra
  entries: 4                 //total number of items in array with Sandra as the supervisor
},
{
  supervisor: "John A.",     //supervisor name
  email: john.a@email.com,   //supervisor email
  employees: 2,              //number of employees supervised by John
  entries: 3                 //total number of items in array with John as the supervisor
}
]

這是我卡住的地方:

var result= list.reduce(function(all,item){
    all[item[3]] = all[item[3]] || []
    all[item[3]].push({
       supervisor: item[3],
       email: item[4],
       employees: item[2]++,
       entries: item[0]++,
    })
  return all
},{})

這里的主要困難似乎是將員工與(非員工)條目區分開來。 看起來所有非員工條目項目在輸入數組中都有 6 個項目(包括月份的值),而員工沒有月份。 通過檢查您正在迭代的內容的長度,可以很容易地識別出這一點。

減少為由主管電子郵件索引的對象,如果它事先不存在,則在該點創建一個對象。 然后,如果您要迭代的項目是雇員,則增加employees屬性(無論如何都增加entries屬性)。

 var list = [ [ "MIKE", //employee first "NGUYEN", //employee last 123, //id "Sandra M.", //supervisor name "sandra.m@email.com" //supervisor email ], [ "MYA", "LANE", 456, "John A", "john.a@email.com" ], [ "RON", "MASTER", 789, "John A", "john.a@email.com" ], [ "MIKE", "NGUYEN", 123, "Sandra M.", "sandra.m@email.com" ], [ "MYA", "LANE", 456, "February", "john A", "john.a@email.com" ], [ "ROBERT", "RULES", 100, "March", "Sandra M.", "sandra.m@email.com" ], [ "ROBERT", "RULES", 100, "March", "Sandra M.", "sandra.m@email.com" ] ] var resultObj = list.reduce(function(all,item){ const isEmployee = item.length === 5; const [supervisor, email] = item.slice(-2); if (!all[email]) { all[email] = { supervisor, email, employees: 0, entries: 0 }; } if (isEmployee) { all[email].employees++; } all[email].entries++; return all },{}); const result = Object.values(resultObj); console.log(result);

對於新的數據結構,制作一組已經算作員工的id。 如果您要迭代的項目包含在該 Set 中,請不要添加到員工數中:

 var list = [ [ "MIKE", //employee first "NGUYEN", //employee last 123, //id "Sandra M.", //supervisor name "sandra.m@email.com" //supervisor email ], [ "MYA", "LANE", 456, "John A", "john.a@email.com" ], [ "RON", "MASTER", 789, "John A", "john.a@email.com" ], [ "MIKE", "NGUYEN", 123, "Sandra M.", "sandra.m@email.com" ], [ "MYA", "LANE", 456, "john A", "john.a@email.com" ], [ "ROBERT", "RULES", 100, "Sandra M.", "sandra.m@email.com" ], [ "ROBERT", "RULES", 100, "Sandra M.", "sandra.m@email.com" ] ] const seenIds = new Set(); var resultObj = list.reduce(function(all,item){ const [id, supervisor, email] = item.slice(-3); if (!all[email]) { all[email] = { supervisor, email, employees: 0, entries: 0 }; } if (!seenIds.has(id)) { all[email].employees++; seenIds.add(id); } all[email].entries++; return all },{}); const result = Object.values(resultObj); console.log(result);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM