gpt4 book ai didi

javascript - 使用reduce函数将数组汇总为对象

转载 作者:行者123 更新时间:2023-12-04 10:30:47 26 4
gpt4 key购买 nike

我的任务是总结超过 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);

关于javascript - 使用reduce函数将数组汇总为对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60424623/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com