问题描述
我正在尝试使用 reduce 从数组中获取以下输出,但是,我无法理解有关 reduce 行为的某些部分,请欣赏一些解释,以便我能够完全掌握它。
最终目标是将结果缩减为单个数组后,根据 vch_number 删除重复对象
归约函数
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',year: 2020,vch_number: 51541,status: 'available' } ],parked:
[ { make: 'bwm',vch_number: 51510,status: 'parked' } ],service:
[ { make: 'bwm',status: 'service' } ] }
desired = [
{ make: 'bwm',status: 'parked' },status: 'service' }
]
// 原始 API 数组
const car = [
{
"name": "available","Vehciles": [
{
"make": "bwm","model": "i8","year": 2000,"vch_number": 51511,},{
"make": "bwm","year": 2020,"vch_number": 51541,}
]
},{
"name": "parked","vch_number": 51510,{
"name": "service",}
]
}
]
解决方法
第一个问题是您在 {}
函数中使用 accumulator
作为第二个参数(所谓的 .reduce()
)。您需要传递一个空数组 []
。
其次,您在这些对象中拥有 Vehciles
数组,因此您必须在内部再执行一次转换。
关于减速器的更多信息: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce
我认为关键是围绕 initialValue
和 accumulator
以及当涉及到 currentValue
时它与 Array.reduce()
有何关系
我整理了这段代码:
const car = [
{
"name": "available","Vehciles": [
{
"make": "bwm","model": "i8","year": 2000,"vch_number": 51511,},{
"make": "bwm","year": 2020,"vch_number": 51541,}
]
},{
"name": "parked","vch_number": 51510,{
"name": "service",}
]
}
];
const result = car.reduce((acc,vch)=>{
const cars = vch.Vehciles.map(vehicle => {
const temp = {
status: vch.name,...vehicle
};
return temp;
}).reduce((carAcc,car) => {
carAcc.push(car);
return carAcc;
},acc);
return acc;
},[]);
console.log(result)
您可以映射对象并使用 Set
检查。
const
data = [{ name: "available",Vehciles: [{ make: "bwm",model: "i8",year: 2000,vch_number: 51511 },{ make: "bwm",year: 2020,vch_number: 51541 }] },{ name: "parked",vch_number: 51510 }] },{ name: "service",vch_number: 51510 }] }],result = data.flatMap(
(seen => ({ name: status,Vehciles }) => Vehciles.flatMap(o => seen.has(o.vch_number)
? []
: (seen.add(o.vch_number),{ ...o,status })
))
(new Set)
);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }