Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如果对象特性相同,则将阵列中的两个对象合并为单个对象,并将唯一特性转换为阵列_Javascript_Arrays_Object_Data Structures - Fatal编程技术网

Javascript 如果对象特性相同,则将阵列中的两个对象合并为单个对象,并将唯一特性转换为阵列

Javascript 如果对象特性相同,则将阵列中的两个对象合并为单个对象,并将唯一特性转换为阵列,javascript,arrays,object,data-structures,Javascript,Arrays,Object,Data Structures,输入- [ {color:'red', shape:'circle', size:'medium'}, {color:'red', shape:'circle', size:'small'} ] 输出- [ {color:'red', shape:'circle', size:['medium','small']} ] 如何在Javascript中实现这一点?您可以创建一个通用函数,将要匹配的对象数组和键数组作为其参数 您可以通过以下步骤执行此操作: 首先对对象数组使用redu

输入-

[
  {color:'red', shape:'circle', size:'medium'},
  {color:'red', shape:'circle', size:'small'}
]
输出-

[
  {color:'red', shape:'circle', size:['medium','small']}
]

如何在Javascript中实现这一点?

您可以创建一个通用函数,将要匹配的对象数组和键数组作为其参数

您可以通过以下步骤执行此操作:

  • 首先对对象数组使用
    reduce()
    ,并将累加器设置为空数组
    []
  • 使用
    Object.keys()
  • 然后在每次迭代中找到累加器数组的元素,其所有给定的道具都与当前对象匹配
  • 如果找到元素,则使用
    forEach()
    其他键并将值推送到相应的数组中
  • 如果未找到元素,则将每个键设置为空数组
  • 最后返回
    reduce()的结果
const arr=[
{颜色:'red',形状:'circle',大小:'medium'},
{颜色:'red',形状:'circle',大小:'small'}
]
功能groupByProps(arr,props){
常数res=arr.reduce((ac,a)=>{
设ind=ac.findIndex(b=>props.every(k=>a[k]==b[k]);
让others=Object.keys(a).filter(x=>!props.includes(x));
如果(ind==-1){
ac.push({…a});
其他.forEach(x=>ac[ac.length-1][x]=[]);
ind=交流长度-1
}
forEach(x=>ac[ind][x].push(a[x]);
返回ac;
},[])
返回res;
}
const res=groupByProps(arr,['color','shape']))

console.log(res)
如果您只想根据
颜色
形状
进行分组,可以使用。创建一个累加器对象,将这两个属性的每个唯一组合用
|
作为键分隔。以及您希望在输出中作为其值的对象。然后使用将这些对象作为数组获取

const输入=[
{颜色:'red',形状:'circle',大小:'medium'},
{颜色:'red',形状:'circle',大小:'small'},
{颜色:'blue',形状:'square',大小:'small'}
];
const merged=input.reduce((acc,{color,shape,size})=>{
常量键=颜色+“|”+形状;
acc[key]=acc[key]|{颜色、形状、大小:[]};
acc[key].size.push(大小);
返回acc
}, {})

console.log(Object.values(merged))
这里有一个简单的
groupBy
函数,它接受对象数组和
道具数组来分组:

let数据=[
{颜色:'red',形状:'circle',大小:'medium'},
{颜色:'red',形状:'circle',大小:'small'}
]
让groupBy=(arr,props)=>Object.values(arr.reduce((r,c)=>{
让key=props.reduce((a,k)=>`${a}${c[k]}`,'')
让otherKeys=Object.keys(c).filter(k=>!props.includes(k))
r[key]=r[key]|{…c,…otherkey.reduce((a,k)=>(a[k]=[],a),{})
forEach(k=>r[key][k].push(c[k]))
返回r
}, {}))

console.log(groupBy(data,['color','shape'])
您是否希望[{color:'red',shape:'square',size:'small'},{color:'red',shape:'circle',size:'small'}]输出[{color:'red',shape:['circle','square'],size:'small'}],以及您如何处理有三个对象且它们都匹配两个共同点的情况,但这两件事不一样吗?只有两个项目吗?是的,我正在寻找一个理想的解决方案,可以处理对象中的重复属性。但是,正如@Cal Irvine所说,当输入是这样的时候,你希望得到什么作为输出:
[{color:'red',shape:'circle',size:'medium'},{color:'red shape:'circle',size:'small'},{color:'red',shape:'square',size:'small'},{color:'blue',shape:'circle',size:'medium'}你将如何对项目进行分组?在这种情况下,我希望输出[{color:'red',shape:'circle',size:'small'},{color:'red shape:'square',size:'small'},{color:'blue',shape:'circle',size:'medium'}]