Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.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 - Fatal编程技术网

Javascript 基于相似值将对象拆分为对象数组

Javascript 基于相似值将对象拆分为对象数组,javascript,Javascript,如果我正确理解了这个问题,一个选择是: var pr = { name: "ball", race: "ball", weapon: "axe", }; var save=new Object; var keys=Object.keys(pr); for(var k in pr) { } console.log(save); // should end up with {name:'ball',race:'ball'} 这是我想到的 const keys = O

如果我正确理解了这个问题,一个选择是:

var pr = {
    name: "ball",
    race: "ball",
    weapon: "axe",
};

var save=new Object;
var keys=Object.keys(pr);

for(var k in pr) { 

}
console.log(save); // should end up with {name:'ball',race:'ball'}

这是我想到的

const keys = Object.keys(pr);
const ret = keys.reduce((ret, k, i) => {
  const f = keys.find((k2, i2) => i !== i2 && pr[k] === pr[k2]);
  if (f) ret[k] = pr[k];
  return ret;
}, {});

一种方法是使用
对象保存为直方图,跟踪重复项。然后,使用
reduce
过滤掉任何计数为0的键。这应该比线性函数(如
find
)具有更好的性能:

var-pr={
名称:“球”,
比赛:“球”,
武器:“斧头”
};
var save={};
for(pr中的var k){
保存时保存[pr[k]]=pr[k]?保存[pr[k]]+1:0;
}
var result=Object.keys(pr).reduce((a,e)=>{
如果(保存[pr[e]]){a[e]=pr[e];}
返回a;
}, {});

控制台日志(结果)它可以工作。简单明了。参考资料:

迭代每个键值对,并累积结果,直到循环结束

var-pr={
名称:“球”,
比赛:“球”,
武器:“斧头”,
项目:“蝙蝠”,
新项目:“蝙蝠”,
新武器:“斧头”
};
var结果=对象。键(pr)。减少(功能(acc,键){
var ispresent=false;
acc.forEach(功能(obj,i){
如果(显示)返回;
if(对象值(obj)[0]==pr[key])
{
obj[key]=pr[key];
ispresent=true;
}
});
如果(!ispresent)
{
var newobj={};newobj[key]=pr[key];
附件推送(新OBJ)
}
返回acc;
},[])

console.log(result)
如果有多组相同的值(比如有第二个
axe
),该怎么办?
var pr = {
  name: "ball",
  race: "ball",
  weapon: "axe"
};

const dupValues = Object.values(pr).reduce(
  (acc, cur) => ({ ...acc, [cur]: (acc[cur] || 0) + 1 }),
  {}
);

const result = Object.keys(pr)
  .filter(key => dupValues[pr[key]] > 1)
  .reduce((acc, curr) => ({ ...acc, [curr]: pr[curr] }), {});

console.log(result);
// {name:'ball',race:'ball'}