使用 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。如果您正在迭代的项目包含在该集合中,请不要添加到员工人数中:
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);
我的任务是总结 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。如果您正在迭代的项目包含在该集合中,请不要添加到员工人数中:
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);