按类似属性分组并用逗号javascript加入它们 - Mysql group concat like

时间:2018-05-03 06:34:55

标签: javascript arrays ecmascript-6

我需要使用相似的类型对下面的数组进行分组,并用逗号分隔每个描述。

输入

let obj=[
  {
    "type": "Bedroom",
    "int_input": 1,
    "enum_input": 0,
    "enum_select": "Yes",
    "description": "Test"
  },
  {
    "type": "Bedroom",
    "int_input": 1,
    "enum_input": 0,
    "enum_select": "Yes",
    "description": "Test1"
  },
  {
    "type": "Bedroom",
    "int_input": 1,
    "enum_input": 0,
    "enum_select": "Yes",
    "description": "Test"
  },
  {
    "type": "Bathroom",
    "int_input": 1,
    "enum_input": 0,
    "enum_select": "Yes",
    "description": "Test"
  },
  {
    "type": "Bathroom",
    "int_input": 1,
    "enum_input": 0,
    "enum_select": "Yes",
    "description": "Test"
  },
  {
    "type": "Bathroom",
    "int_input": 1,
    "enum_input": 0,
    "enum_select": "Yes",
    "description": "Test"
  }
]

输出

let finalobj=[
  {
    "type": "Bedroom",
     "description": "Test,Test1,Test"
  },
  {
    "type": "Bathroom",
    "description": "Test,Test,Test"
  }
]

我的尝试(我非常接近,但在第一组中未定义)



let obj=[
  {
    "type": "Bedroom",
    "int_input": 1,
    "enum_input": 0,
    "enum_select": "Yes",
    "description": "Test"
  },
  {
    "type": "Bedroom",
    "int_input": 1,
    "enum_input": 0,
    "enum_select": "Yes",
    "description": "Test1"
  },
  {
    "type": "Bedroom",
    "int_input": 1,
    "enum_input": 0,
    "enum_select": "Yes",
    "description": "Test"
  },
  {
    "type": "Bathroom",
    "int_input": 1,
    "enum_input": 0,
    "enum_select": "Yes",
    "description": "Test"
  },
  {
    "type": "Bathroom",
    "int_input": 1,
    "enum_input": 0,
    "enum_select": "Yes",
    "description": "Test"
  },
  {
    "type": "Bathroom",
    "int_input": 1,
    "enum_input": 0,
    "enum_select": "Yes",
    "description": "Test"
  }
]
//first take the type
let type_only=obj.map(o=>o.type);
type_only=Array.from(new Set(type_only));

let sum_obj={};
let arr=[];
//iterate types

{type_only.map((val,index) =>{
    sumobj = obj.reduce((c, v) => v.type === val ? {'description': (c.description + ','+ v.description),'type':v.type} : c, 0)
    arr.push(sumobj);
    }
    )}

console.log(arr);
console.log(type_only);




4 个答案:

答案 0 :(得分:1)

只需reduce进入一个对象,按类型分组,然后映射回一个对象数组:

const input=[
  {
    "type": "Bedroom",
    "int_input": 1,
    "enum_input": 0,
    "enum_select": "Yes",
    "description": "Test"
  },
  {
    "type": "Bedroom",
    "int_input": 1,
    "enum_input": 0,
    "enum_select": "Yes",
    "description": "Test1"
  },
  {
    "type": "Bedroom",
    "int_input": 1,
    "enum_input": 0,
    "enum_select": "Yes",
    "description": "Test"
  },
  {
    "type": "Bathroom",
    "int_input": 1,
    "enum_input": 0,
    "enum_select": "Yes",
    "description": "Test"
  },
  {
    "type": "Bathroom",
    "int_input": 1,
    "enum_input": 0,
    "enum_select": "Yes",
    "description": "Test"
  },
  {
    "type": "Bathroom",
    "int_input": 1,
    "enum_input": 0,
    "enum_select": "Yes",
    "description": "Test"
  }
];
const outputObj = input.reduce((accum, { type, description }) => {
  if (!accum[type]) accum[type] = description;
  else accum[type] += ',' + description;
  return accum;
}, {});
const output = Object.entries(outputObj).map(([ type, description]) => ({ type, description }));
console.log(output);

答案 1 :(得分:1)

尝试以下



sample_data




答案 2 :(得分:0)

如果累加器上不存在,则使用reduce,构建基础对象,并添加当前描述。使用Object.values()转换回数组:

const obj = [{"type":"Bedroom","int_input":1,"enum_input":0,"enum_select":"Yes","description":"Test"},{"type":"Bedroom","int_input":1,"enum_input":0,"enum_select":"Yes","description":"Test1"},{"type":"Bedroom","int_input":1,"enum_input":0,"enum_select":"Yes","description":"Test"},{"type":"Bathroom","int_input":1,"enum_input":0,"enum_select":"Yes","description":"Test"},{"type":"Bathroom","int_input":1,"enum_input":0,"enum_select":"Yes","description":"Test"},{"type":"Bathroom","int_input":1,"enum_input":0,"enum_select":"Yes","description":"Test"}];

const result = Object.values(obj.reduce((r, { type, description }) => {
  r[type] = r[type] || { type, description: '' };
  
  r[type].description += `${r[type].description ? ' ,' : ''}${description}`;
  
  return r;
}, Object.create(null)));

console.log(result);

答案 3 :(得分:0)

您可以将array#reduceMap一起使用。

let arr = [ { "type": "Bedroom", "int_input": 1, "enum_input": 0, "enum_select": "Yes", "description": "Test" }, { "type": "Bedroom", "int_input": 1, "enum_input": 0, "enum_select": "Yes", "description": "Test1" }, { "type": "Bedroom","int_input": 1, "enum_input": 0, "enum_select": "Yes", "description": "Test" }, { "type": "Bathroom", "int_input": 1, "enum_input": 0, "enum_select": "Yes", "description": "Test" }, { "type": "Bathroom", "int_input": 1, "enum_input": 0, "enum_select":"Yes", "description": "Test" }, { "type": "Bathroom", "int_input": 1, "enum_input": 0, "enum_select": "Yes", "description": "Test" } ],
    result = [...arr.reduce((map,{type, description}) => {
      map.has(type) ? map.get(type).description += ', ' + description : map.set(type, {type, description});
      return map;
    },new Map).values()];
console.log(result);