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'}