如何基于javascript中的对象属性对数据进行分组?

时间:2020-03-20 06:47:25

标签: javascript angular

JSON :(基本上我有对象数组。应该将前3个对象设置为一个表单组,因此需要根据mat_name.id将前3个对象转换为1个对象。.编辑了我的问题..您能帮我做这个吗? ??)

  const array1 = [{
                   mat_name:{
                             id:1,
                             title:"rose"
                    },
                   month:Mar,
                   year:2020,
                   price:20
                  },
                  {
                   mat_name:{
                             id:1,
                             title:"rose"
                    },
                   month:Apr,
                   year:2020,
                   price:30
                  },
                  {
                   mat_name:{
                             id:1,
                             title:"rose"
                    },
                   month:May,
                   year:2020,
                   price:40
                  },
                  {
                   mat_name:{
                             id:2,
                             title:"jasmine"
                    },
                   month:Mar,
                   year:2020,
                   price:50
                  },
                  {
                   mat_name:{
                             id:2,
                             title:"jasmine"
                    },
                   month:Apr,
                   year:2020,
                   price:60
                   },
                   {
                   mat_name:{
                             id:2,
                             title:"jasmine"
                    },
                   month:May,
                   year:2020,
                   price:80
                   }      
                 ];

转换Json :(上面的数组应根据月份,年份和mat_name进行此操作。)

       const array1 = [
                       {
                       mat_name:'Rose',
                       mat_id:1,
                       price1:20,
                       price2:30,
                       price3:40
                        },
                         {
                       mat_name:'Jasmine',
                       mat_id: 2,
                       price1:50,
                       price2:60,
                       price3:80
                        },
                         ]

1 个答案:

答案 0 :(得分:0)

您可以将.reduce()与ES6 Map结合使用,对所有价格进行分组。在此,地图使用mat_name作为其键,并使用与该mat_name相关的价格数组作为其值。通过将此映射作为第一个参数传递到Array.from()中,并作为第二个参数提供映射功能,可以将数组中的每个键值对映射到对象。该对象可以包含mat_name,以及数组中的价格(使用Object.assign()合并):

const arr = [{ mat_name: 'Rose', month: 'Mar', year: 2020, price: 20 }, { mat_name: 'Rose', month: 'Apr', year: 2020, price: 30 }, { mat_name: 'Rose', month: 'May', year: 2020, price: 40 }, { mat_name: 'Jasmine', month: 'Mar', year: 2020, price: 50 }, { mat_name: 'Jasmine', month: 'Apr', year: 2020, price: 60 }, { mat_name: 'Jasmine', month: 'May', year: 2020, price: 80 } ];

const res = Array.from(
  arr.reduce((m, {mat_name, price}) =>
    m.set(mat_name, [...(m.get(mat_name) || []), price]), new Map), 
  ([mat_name, prices]) => 
    Object.assign({mat_name}, ...prices.map((p, i) => ({['price'+(i+1)]: p})))
);

console.log(res);