Javascript 如何在合并一个数组的字段时减少该数组

Javascript 如何在合并一个数组的字段时减少该数组,javascript,Javascript,我有这个 var o = [{ "id": 1, // its actually a string in real life "course": "name1", // more properties }, { "id": 1, // its actually a string in real life "course": "name2", // more properties }]; 我想要这个 var r = [{ "id": 1, // its actual

我有这个

var o = [{
  "id": 1, // its actually a string in real life
  "course": "name1",
  // more properties
}, 
{
  "id": 1, // its actually a string in real life
  "course": "name2",
  // more properties
}];
我想要这个

var r = [{
  "id": 1, // its actually a string in real life
  "course": ["name1", "name2"],
}];
我正在尝试这个

var flattened = [];
for (var i = 0; i < a.length; ++i) {
  var current = a[i];
  if(flattened.)
}
但我被卡住了,我不知道下一步该做什么,数组将有超过2条记录,但这只是一个例子


有更多的字段,但为了简单起见,我删除了它们,我不会在最终数组中使用它们。

您可以减少数组并找到对象

var数组=[{id:1,课程名称1},{id:1,课程名称2}], flat=array.reducer,{id,course}=>{ var temp=r.findo=>id==o.id; 如果!临时{ r、 pushtemp={id,课程:[]}; } 临时课程; 返回r; }, [];
控制台。对数平面 您可以减少数组并找到对象

var数组=[{id:1,课程名称1},{id:1,课程名称2}], flat=array.reducer,{id,course}=>{ var temp=r.findo=>id==o.id; 如果!临时{ r、 pushtemp={id,课程:[]}; } 临时课程; 返回r; }, [];
控制台。对数平面 这样,您可以将数据展平为所需的形状

常数o=[ { id:1, 课程名称:1 }, { id:1, 课程名称:2 }, { id:2, 课程名称:2 } ]; 常数r=o.reduceac,当前=>{ const index=acc.findIndexx=>x.id==current.id; 如果索引!==-1{ acc[index].course.pushcurrent.course; }否则{ acc.push{id:current.id,课程:[current.course]}; } 返回acc }, [];
console.logr 这样,您可以将数据展平为所需的形状

常数o=[ { id:1, 课程名称:1 }, { id:1, 课程名称:2 }, { id:2, 课程名称:2 } ]; 常数r=o.reduceac,当前=>{ const index=acc.findIndexx=>x.id==current.id; 如果索引!==-1{ acc[index].course.pushcurrent.course; }否则{ acc.push{id:current.id,课程:[current.course]}; } 返回acc }, []; console.logr 您可以使用.reduce创建一个密钥对象,然后使用该对象将密钥设置为id。这样,您可以通过以对象的id为目标添加到同一课程数组中。最后,您可以获取对象的值以获得结果

见下例:

变量o=[{ id:1, 课程名称:1, 傅:1 }, { id:1, 课程名称2, 酒吧:2间 }]; var res=Object.valueso.reduceacc,{id,course,…rest}=>{ 在acc中的ifid acc[id]={……acc[id],课程:[……acc[id]。课程,课程],……rest}; else acc[id]={id,course:[course],…rest}; 返回acc; }, {}; console.logres 您可以使用.reduce创建一个密钥对象,然后使用该对象将密钥设置为id。这样,您可以通过以对象的id为目标添加到同一课程数组中。最后,您可以获取对象的值以获得结果

见下例:

变量o=[{ id:1, 课程名称:1, 傅:1 }, { id:1, 课程名称2, 酒吧:2间 }]; var res=Object.valueso.reduceacc,{id,course,…rest}=>{ 在acc中的ifid acc[id]={……acc[id],课程:[……acc[id]。课程,课程],……rest}; else acc[id]={id,course:[course],…rest}; 返回acc; }, {};
console.logres 您可以使用reduce来累积结果。在当前结果累加器a中搜索具有相同id的对象el,如果找到,将课程附加到现有对象并返回相同的累加器,否则将课程作为数组放入累加器中

var res = o.reduce((a, {id,course}) => {
    var found = a.find(el => el.id == id);
    return found ? found.course.push(course) && a : [...a, {id, course: [course]}];
}, []);

您可以使用reduce来累积结果。在当前结果累加器a中搜索具有相同id的对象el,如果找到,将课程附加到现有对象并返回相同的累加器,否则将课程作为数组放入累加器中

var res = o.reduce((a, {id,course}) => {
    var found = a.find(el => el.id == id);
    return found ? found.course.push(course) && a : [...a, {id, course: [course]}];
}, []);
函数mergearray,键='id'{ 常量obj={} 数组的forconst项{ const existing=obj[项[键]] 如果存在{ Object.entrie项的forconst[name,value]{ ifname==键继续; 如果存在[名称]{ 现有[名称]=[…现有[名称]。$custom?现有[名称]:[现有[名称]],值] 现有[名称]。$custom=true; }否则{ 现有[名称]=值; } } }否则{ obj[item[key]={…item} } } 返回Object.valuesobj } 变量o=[ { id:1, 单曲:测试 }, { id:1, 课程名称:1, 多字段:测试 }, { id:1, 课程名称:2 }, { id:1, 纽菲尔德:测试 }, { id:2, 另一个:测试, 数组:[1,3,4] }, { id:2, 数组:文本 }]; 控制台logmergeo 函数mergearray,键='id'{ 常量obj={} 数组的forconst项{ const existing=obj[项[键]] 如果存在{ Object.entrie项的forconst[name,value]{ ifname==键继续; 如果存在[名称]{ 现有[名称]=[…现有[名称]。$custom?现有[名称]:[现有[名称]],值] 现有[名称]。$custom=true; }否则{ 现有[名称]=值; } } }否则{ obj[item[key]={…item} } } 返回Object.valuesobj } 变量o=[ { id:1, 单曲:测试 }, { id:1, 课程名称:1, 多字段:测试 }, { id:1, 课程名称:2 }, { id:1, 纽菲尔德:测试 }, { id:2, 另一个:测试, 数组:[1,3,4] }, { id:2, 数组:文本 }]; console.logmergeo您可以使用和执行此操作。此示例适用于任意数量的属性:

常数o=[ {id:1,课程:'name1',时间:'morning',主题:'math'}, {id:1,课程:'name2',时间:'午后'}, {id:2,课程:'name3',时间:'night'} ]; const result=o.reduceout,{id,…rest}=>{ out[id]=out[id]|{}; const mergedProps=Object.entrieresest.reduceac[k,v]=>{ 返回{…acc[k]:[…out[id][k]| |[],v]}; },out[id]; out[id]={id,…mergedProps}; 返回; }, {}; console.logresult 你可以用和来做这件事。此示例适用于任意数量的属性:

常数o=[ {id:1,课程:'name1',时间:'morning',主题:'math'}, {id:1,课程:'name2',时间:'午后'}, {id:2,课程:'name3',时间:'night'} ]; const result=o.reduceout,{id,…rest}=>{ out[id]=out[id]|{}; const mergedProps=Object.entrieresest.reduceac[k,v]=>{ 返回{…acc[k]:[…out[id][k]| |[],v]}; },out[id]; out[id]={id,…mergedProps}; 返回; }, {};
console.logresult;这些东西是按id排序的吗?@NinaScholz不,它实际上是一个string@NickParsons我认为在这种情况下最好将其称为字符串,很抱歉混淆了可能的重复,对象是否按id排序?@NinaScholz不,它实际上是一个字符串string@NickParsons我认为在这种情况下最好称之为字符串,很抱歉造成混淆。我的解决方案优点可能重复1。您可以指定自定义id键2。未合并的属性不是arraysMy解决方案的好处是1。您可以指定自定义id键2。未合并的属性不是阵列请提供解释或说明,说明为什么这是解决方案。请提供解释或说明,说明为什么这是解决方案。