2017-07-02 75 views
0

合并与排序的对象数组我有这个对象:按日期

{ 
id: 1, 
nums: 3, 
dates: [ 
    { 
     date: '21-10-2012', 
     promo: { 
      id: 1, 
      name: 'promo 1' 
     }, 
     hours: [ 
      { 
       hour: '22:00', 
       vision: { 
        id: 1, 
        name: '2D' 
       } 
      }, 
      { 
       hour: '23:00', 
       vision: { 
        id: 2, 
        name: '3D' 
       } 
      } 
     ] 
    }, 
    { 
     date: '21-10-2012', 
     promo: { 
      id: 2, 
      name: 'promo 2' 
     }, 
     hours: [ 
      { 
       hour: '22:00', 
       vision: { 
        id: 2, 
        name: '3D' 
       } 
      } 
     ] 
    }, 
    { 
     date: '21-10-2013', 
     promo: { 
      id: 2, 
      name: 'nome promo' 
     }, 
     hours: [ 
      { 
       hour: '22:00', 
       vision: { 
        id: 2, 
        name: '3D' 
       } 
      } 
     ] 
    } 
]} 

我要合并具有相同的日期值这些覆盖宣传片和小时和对象。下面有结果,我想:

{ 
id: 1, 
nums: 3, 
dates: [ 
    { 
     date: '21-10-2012', 
     promo: { 
      id: 2, 
      name: 'promo 2' 
     }, 
     hours: [ 
      { 
       hour: '22:00', 
       vision: { 
        id: 2, 
        name: '3D' 
       } 
      }, 
      { 
       hour: '23:00', 
       vision: { 
        id: 2, 
        name: '3D' 
       } 
      } 
     ] 
    }, 
    { 
     date: '21-10-2013', 
     promo: { 
      id: 2, 
      name: 'nome promo' 
     }, 
     hours: [ 
      { 
       hour: '22:00', 
       vision: { 
        id: 2, 
        name: '3D' 
       } 
      } 
     ] 
    } 
]} 

我试图做的东西,但我不知道该怎么做exacly:

obj.dates.reduce(function(acc, curr) { 
    if (new Date(acc.date).valueOf() === new Date(curr.date).valueOf()) { 
     acc.hours = acc.hours.reduce(function(acc, curr) { 
      return Object.assign(acc, curr); 
     }); 
    } 
    return Object.assign(acc, curr); 
}, {}) 
+0

在我的OBJ结果例如, “小时” 使得仅覆盖具有相同小时。我认为我在答案中解释不好。 – Kouga

+0

“distint”是什么意思? – 2017-07-02 12:50:23

+0

我修改了标题:P – Kouga

回答

1

解决!希望对某人有用!

let obj = { 
 
     id: 1, 
 
     nums: 3, 
 
     dates: [ 
 
      { 
 
       rif: "2017-03-13T00:00:02.000Z", 
 
       date: '21-10-2012', 
 
       promo: { 
 
        id: 1, 
 
        name: 'promo 1' 
 
       }, 
 
       hours: [ 
 
        { 
 
         hour: '22:00', 
 
         vision: { 
 
          id: 1, 
 
          name: '2D' 
 
         } 
 
        }, 
 
        { 
 
         hour: '23:00', 
 
         vision: { 
 
          id: 2, 
 
          name: '3D' 
 
         } 
 
        } 
 
       ] 
 
      }, 
 
      { 
 
       rif: "2017-03-13T00:00:03.000Z", 
 
       date: '21-10-2012', 
 
       promo: { 
 
        id: 2, 
 
        name: 'promo 2' 
 
       }, 
 
       hours: [ 
 
        { 
 
         hour: '22:00', 
 
         vision: { 
 
          id: 2, 
 
          name: '3D' 
 
         } 
 
        } 
 
       ] 
 
      }, 
 
      { 
 
       rif: "2017-03-13T00:00:02.000Z", 
 
       date: '21-10-2013', 
 
       promo: { 
 
        id: 2, 
 
        name: 'nome promo' 
 
       }, 
 
       hours: [ 
 
        { 
 
         hour: '27:00', 
 
         vision: { 
 
          id: 2, 
 
          name: '3D' 
 
         } 
 
        } 
 
       ] 
 
      } 
 
     ] 
 
    }; 
 

 
    let res = []; 
 

 
    let dates = Array.from(new Set(obj.dates.map(x => x.date))); 
 

 
dates.forEach(v => { 
 
    res.push(
 
     obj.dates.filter(x => x.date === v) 
 
     .sort((a, b) => new Date(a.rif).getTime() - new Date(b.rif).getTime()) 
 
     .reduce((acc, curr) => { 
 

 
      let hours = acc.hours.concat(curr.hours);   
 
      let newHours = []; 
 

 
      Array.from(new Set(hours.map(x => x.hour))) 
 
      .forEach(h => { 
 
       newHours.push(
 
        hours.filter(x => x.hour === h) 
 
        .reduce((s, d) => Object.assign(s, d)) 
 
       ) 
 
      }); 
 

 
      return Object.assign(acc, curr, { hours: newHours }); 
 
     }) 
 
    ); 
 
}); 
 
     
 
console.log(res);