Javascript 使用Reduce重新排列数组对象
我正在尝试使用reduce从数组中获得以下输出,但是,我无法理解reduce如何工作的某些部分,请给出一些解释,以便我能够完全掌握它 最终目标是在将结果缩减为单个数组后,根据vch_编号删除重复对象 还原函数Javascript 使用Reduce重新排列数组对象,javascript,arrays,object,reduce,Javascript,Arrays,Object,Reduce,我正在尝试使用reduce从数组中获得以下输出,但是,我无法理解reduce如何工作的某些部分,请给出一些解释,以便我能够完全掌握它 最终目标是在将结果缩减为单个数组后,根据vch_编号删除重复对象 还原函数 const result = car.reduce((acc,vch)=>{ const temp = {...acc,[vch.name]:vch.Vehciles} for (const [key, value] of Object.entries(temp)){ cons
const result = car.reduce((acc,vch)=>{
const temp = {...acc,[vch.name]:vch.Vehciles}
for (const [key, value] of Object.entries(temp)){
const fillterd = value.map(item => {
item.status = key
return item
})
}
return temp
}
,{})
console.log(result)
//最终期望输出与电流输出
current = { available:
[ { make: 'bwm',
model: 'i8',
year: 2000,
vch_number: 51511,
status: 'available' },
{ make: 'bwm',
model: 'i8',
year: 2020,
vch_number: 51541,
status: 'available' } ],
parked:
[ { make: 'bwm',
model: 'i8',
year: 2000,
vch_number: 51510,
status: 'parked' } ],
service:
[ { make: 'bwm',
model: 'i8',
year: 2000,
vch_number: 51510,
status: 'service' } ] }
desired = [
{ make: 'bwm',
model: 'i8',
year: 2000,
vch_number: 51511,
status: 'available' },
{ make: 'bwm',
model: 'i8',
year: 2020,
vch_number: 51541,
status: 'available' },
{ make: 'bwm',
model: 'i8',
year: 2000,
vch_number: 51510,
status: 'parked' } ,
{ make: 'bwm',
model: 'i8',
year: 2000,
vch_number: 51510,
status: 'service' }
]
//原始API数组
const car = [
{
"name": "available",
"Vehciles": [
{
"make": "bwm",
"model": "i8",
"year": 2000,
"vch_number": 51511,
},
{
"make": "bwm",
"model": "i8",
"year": 2020,
"vch_number": 51541,
}
]
},
{
"name": "parked",
"Vehciles": [
{
"make": "bwm",
"model": "i8",
"year": 2000,
"vch_number": 51510,
}
]
},
{
"name": "service",
"Vehciles": [
{
"make": "bwm",
"model": "i8",
"year": 2000,
"vch_number": 51510,
}
]
}
]
您可以映射对象并使用
集进行检查
const
数据=[{name:“可用”,车辆档案:[{make:“bwm”,型号:“i8”,年份:2000,vch_编号:51511},{make:“bwm”,型号:“i8”,年份:2020,vch_编号:51541},{name:“parked”,车辆档案:[{make:“bwm”,型号:“i8”,年份:2000,vch_编号:51510},{name:“service”,车辆档案:[{make:“bwm”,型号:“i8”,年份:2000,vch_编号:51510}],
结果=data.flatMap(
(seen=>({name:status,Vehciles})=>Vehciles.flatMap(o=>seen.has(o.vch_编号)
? []
:(参见。添加(o.vch_编号),{…o,状态})
))
(新一套)
);
控制台日志(结果)代码>
.as控制台包装{max height:100%!important;top:0;}
第一个问题是在.reduce()
函数中使用{}
作为第二个参数(所谓的累加器
)。您需要传递一个空数组[]
。
其次,在这些对象中有Vehciles
数组,因此必须在其中执行一次转换
有关减速器的更多信息:
我认为关键是要围绕初始值
和累加器
,以及它与当前值
在数组中的关系。reduce()
我已经编写了以下代码:
const car=[
{
“名称”:“可用”,
“车辆档案”:[
{
“制造”:“bwm”,
“型号”:“i8”,
“年份”:2000年,
“vch_编号”:51511,
},
{
“制造”:“bwm”,
“型号”:“i8”,
“年份”:2020年,
“vch_编号”:51541,
}
]
},
{
“名称”:“停放”,
“车辆档案”:[
{
“制造”:“bwm”,
“型号”:“i8”,
“年份”:2000年,
“vch_编号”:51510,
}
]
},
{
“名称”:“服务”,
“车辆档案”:[
{
“制造”:“bwm”,
“型号”:“i8”,
“年份”:2000年,
“vch_编号”:51510,
}
]
}
];
const result=车辆减少量((acc,vch)=>{
const cars=vch.Vehciles.map(车辆=>{
常数温度={
状态:vch.name,
…车辆
};
返回温度;
}).减少((carAcc,car)=>{
carAcc.推(车);
返回carAcc;
},acc);
返回acc;
}, []);
console.log(结果)
51510的功能是什么?为什么会在结果集中重复两次?每个对象上都有我没有添加到该数组中的时间戳!如果重复,哪个属性与决定相关?在API上,每个道具上都有这个嵌套对象,我删除了它以降低复杂性&创建的at是我的相关道具,带有vch编号“VehcileStatus”:{“statusId”:2,“createdAt”:“2021-03-16T01:39:48.000Z”,“更新日期”:“2021-03-16T01:39:48.000Z”}
谢谢!可以使用async和reduce合并新的集合结果吗?我不知道。请自己试试。感谢Nina的帮助!很抱歉Filip,第二个reduce中的carAcc数组来自哪里?因为您的目标是将整个数据展平到单个数组中。我们首先传递一个空的[]
作为第一个reduce
中的累加器
我们将其作为参数acc
。然后我们将acc
传递给第二个内部reduce
,该内部累加器已经在减少由映射修改的数组(它“注入”了状态:vch.name
)。我们在内部reduce
回调中得到acc
,作为carAcc
。因此,TLDR;result
,acc
和carAcc
是我们作为第二个参数传递给最顶端的reduce
的同一个数组[]
。希望有帮助!