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

时间:2017-03-29 01:09:38

标签: javascript arrays node.js ecmascript-6 reduce

我有一个数据集,它是一个对象数组,用于数据库中的某些项目,其中详细说明了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,并且仅在shippingMethod.estimatedDays与所有项目相比最大的情况下返回一个新数组。

所以结束数组将是一个对象数组(在这种情况下)有3种运送方式:STANDARD,TWODAY和NEXTDAY。

1 个答案:

答案 0 :(得分:0)

您可以使用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);
&#13;
&#13;
&#13;