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。未合并的属性不是阵列请提供解释或说明,说明为什么这是解决方案。请提供解释或说明,说明为什么这是解决方案。