比较和减少复杂的对象数组

Compare and reduce complex array of objects

我有一个``数据集,它是数据库中某些项目的对象数组,其中包含 estimatedDays 需要多长时间的详细信息要运送的特定物品:

items : [
    {
    id: '1'
    shippingMethods: [
        {
        id: 'STANDARD',
        estimatedDays: 3,
        },
        {
        id: 'TWODAY',
        estimatedDays: 2,
        },
        {
        id: 'NEXTDAY',
        estimatedDays: 1,
        },
    ]
    },
    {
    id: '2'
    // same shipping data as above but standard shipping will take 4 estimatedDays
    },
    {
    id: '3'
    // same shipping data as above but TWODAY shipping will take 3 estimatedDays
    },
]

我想知道是否有一个 reduce 函数可以比较每个项目中的每个 shippingMethod.id 和 return 一个新数组,仅返回 shippingMethod.estimatedDays 与所有项目相比最大的数组。

所以最后的数组将是一个包含(在本例中)3 种运输方式的对象数组:STANDARD、TWODAY 和 NEXTDAY。

这里是reduce方法,

reduce

var items = [
    {
    id: '1',
    shippingMethods: [
        {
        id: 'STANDARD',
        estimatedDays: 3
        },
        {
        id: 'TWODAY',
        estimatedDays: 2
        },
        {
        id: 'NEXTDAY',
        estimatedDays: 1
        },
    ]
    },
    {
    id: '2',
    shippingMethods: [
        {
        id: 'STANDARD',
        estimatedDays: 4
        },
        {
        id: 'TWODAY',
        estimatedDays: 2
        },
        {
        id: 'NEXTDAY',
        estimatedDays: 1
        },
    ]
    },
    {
    id: '3',
    shippingMethods: [
        {
        id: 'STANDARD',
        estimatedDays: 3
        },
        {
        id: 'TWODAY',
        estimatedDays: 3
        },
        {
        id: 'NEXTDAY',
        estimatedDays: 1
        },
    ]
    },
];

var outItems = items.reduce(function(accu, curr){
   if(curr.shippingMethods) {
      if(accu.length > 0) {
         for(var i = 0; i < curr.shippingMethods.length; i++) {
            var current = curr.shippingMethods[i];
            if(accu[i].id === current.id && accu[i].estimatedDays < current.estimatedDays) {
               accu[i] = current;
            }
         }
      } else {
         accu = curr.shippingMethods;
      }
   }
   
   return accu;
}, []);

console.log(outItems);