使用 Reduce 重新排列数组对象

Using Reduce to rearrange an Object of Arrays

我正在尝试使用 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',
       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,

            }
        ]
    }
]

您可以映射对象并使用 Set 检查。

const
    data = [{ 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 }] }],
    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; }

第一个问题是您在 .reduce() 函数中使用 {} 作为第二个参数(所谓的 accumulator)。您需要传递一个空数组 []。 其次,你在这些对象中有 Vehciles 数组,所以你必须在里面再执行一次转换。

关于减速器的更多信息: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

我认为关键是让你的头脑围绕 initialValueaccumulator 以及它与 currentValue 的关系如何涉及到 Array.reduce()

我编写了这段代码:

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 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)