Javascript 删除对象中的重复值,但将值存储在数组中
给定以下对象数组,我如何创建一个新的数组,其中如果有一个对象具有相同的电子邮件,它只需将favoriteSport添加到数组中即可。我想要实现的是删除重复数据 关于如何在Javascript中解决这个问题,有什么建议吗Javascript 删除对象中的重复值,但将值存储在数组中,javascript,arrays,data-structures,mapreduce,reduce,Javascript,Arrays,Data Structures,Mapreduce,Reduce,给定以下对象数组,我如何创建一个新的数组,其中如果有一个对象具有相同的电子邮件,它只需将favoriteSport添加到数组中即可。我想要实现的是删除重复数据 关于如何在Javascript中解决这个问题,有什么建议吗 data = [ { name: 'Lisa Simpson', email: 'lisa@email.com', favoriteSport: 'Soccer' }, { name: 'Lisa Simpson', em
data = [
{
name: 'Lisa Simpson',
email: 'lisa@email.com',
favoriteSport: 'Soccer'
},
{
name: 'Lisa Simpson',
email: 'lisa@email.com',
favoriteSport: 'Tennis'
},
{
name: 'Lisa Simpson',
email: 'lisa@email.com',
favoriteSport: 'Swimming'
},
{
name: 'Lisa Simpson',
email: 'lisa@email.com',
favoriteSport: 'Voleyball'
}
]
//Expected Output
[
{
name: 'Lisa Simpson',
email: 'lisa@email.com',
favoriteSport: ['Soccer', 'Tennis', 'Swimming', 'Voleyball']
}
]
您可以使用
forEach
进行迭代,然后使用find
、filter
和map
来获得预期的结果
我们可以使用newset(array)
获取唯一值,然后array。from(newset(array))
将再次将其转换为array
a=[{
姓名:“丽莎·辛普森”,
电邮:'lisa@email.com',
最喜欢的运动:“足球”
}, {
姓名:“丽莎·辛普森”,
电邮:'lisa@email.com',
喜爱的运动:“网球”
}, {
姓名:“丽莎·辛普森”,
电邮:'lisa@email.com',
最喜欢的运动:“游泳”
}, {
姓名:“丽莎·辛普森”,
电邮:'lisa@email.com',
最喜欢的运动:“排球”
}, {
姓名:“丽莎·辛普森”,
电邮:'lisa@email.com',
最喜欢的运动:“足球”
}, {
姓名:“丽莎·辛普森”,
电邮:'lisa@email.com',
喜爱的运动:“网球”
}, {
姓名:“荷马·辛普森”,
电邮:'homer@email.com',
最喜欢的运动:“烧烤”
}, {
姓名:“荷马·辛普森”,
电邮:'homer@email.com',
最喜欢的运动:“电视马拉松”
}];
让结果=[];
a、 forEach((i)=>{
如果(!result.find(x=>x.name==i.name&&x.email==i.email)){
结果:推({
姓名:i.name,
电子邮件:即电子邮件,
favoriteSport:Array.from(新集合(a.filter(x=>x.name==i.name&&x.email==i.email).map(x=>x.favoriteSport)))
});
}
});
控制台日志(结果)代码>您可以像这样尝试使用reduce。您首先搜索以查看是否已找到相同的电子邮件,因此您的数组在电子邮件中是唯一的,然后添加数据
const数据=[{
姓名:“丽莎·辛普森”,
电邮:'lisa@email.com',
最喜欢的运动:“足球”
},{
姓名:“丽莎·辛普森”,
电邮:'lisa@email.com',
喜爱的运动:“网球”
},{
姓名:“丽莎·辛普森”,
电邮:'lisa@email.com',
最喜欢的运动:“游泳”
},{
姓名:“丽莎·辛普森”,
电邮:'lisa@email.com',
喜爱的运动:“排球”};
常量组=(数据)=>
数据减少((acc,val)=>{
const found=acc.find((item)=>item.email==val.email);
if(find&!find.favoriteSport.includes(val.favoriteSport))find.favoriteSport.push(val.favoriteSport);
else acc.push({…val,favoriteSport:[val.favoriteSport]});
返回acc;
}, []);
控制台日志(组(数据))代码>现在抛出的解决方案被认为是一种通用编写的基于reduce
的方法的证明
其主要思想是编写一个可重用的reducer函数,该函数使用其第一个acculator
参数作为存储对象,保存此特定任务的配置和结果。它还丰富了作为注册表临时传递的对象,以便提供快速查找,更好地检测项和字符串值重复
const数据=[{
姓名:“丽莎·辛普森”,
电邮:'lisa@email.com',
最喜欢的运动:“足球”
}, {
姓名:“丽莎·辛普森”,
电邮:'lisa@email.com',
喜爱的运动:“网球”
}, {
姓名:“丽莎·辛普森”,
电邮:'lisa@email.com',
最喜欢的运动:“游泳”
}, {
姓名:“丽莎·辛普森”,
电邮:'lisa@email.com',
最喜欢的运动:“排球”
}, {
姓名:“丽莎·辛普森”,
电邮:'lisa@email.com',
最喜欢的运动:“足球”
}, {
姓名:“丽莎·辛普森”,
电邮:'lisa@email.com',
喜爱的运动:“网球”
}, {
姓名:“荷马·辛普森”,
电邮:'homer@email.com',
最喜欢的运动:“烧烤”
}, {
姓名:“荷马·辛普森”,
电邮:'homer@email.com',
最喜欢的运动:“电视马拉松”
}];
函数concatSameItemStringValueByKeys(收集器,项){
const{assign}=对象;
const{samenessKey,concatKey,list}=收集器;
const itemRegistry=(collector.itemRegistry | |(collector.itemRegistry={}));
const accessKey=item[sameneskey];
const stringValue=项[concatKey];
让registeredItem=itemRegistry[accessKey];
如果(注册数据项){
如果(!(registeredItem.valueRegistry中的stringValue)){/-防止项目特定值重复。
registeredItem.valueRegistry[stringValue]=true;
registeredItem.type[concatKey].push(stringValue);//-concat项特定值。
}
}否则{
registeredItem=itemRegistry[accessKey]={/-创建特定于项的注册表。
类型:分配({},项),//-分配浅表项副本。
valueRegistry:{}/-创建特定于项的值注册表。
};
registeredItem.valueRegistry[stringValue]=true;//-防止将来项目特定的值重复。
registeredItem.type[concatKey]=[stringValue];//-最初将特定于项的值映射到{Array}。
list.push(registeredItem.type);//-将初始映射+注册的项另外存储到列表中。
}
回程收集器;
}
const reducedData=data.reduce(concatSameItemStringValueByKeys{
samenessKey:“电子邮件”,
concatKey:“最喜爱的运动”,
名单:[]
}).名单;
log('reducedData:',reducedData)代码>
.as console wrapper{max height:100%!important;top:0;}
您可以通过将数组减少为电子邮件键入的对象,并将相应的值作为所需的最终对象来完成此操作。然后,您可以使用对象获取最终数组。值
:
var数据=[{
姓名:“丽莎·辛普森”,
电邮:'lisa@email.com',
最喜欢的运动:“足球”
},
{
姓名:“丽莎·辛普森”,
电邮:'lisa@email.com',
喜爱的运动:“网球”
},
{
姓名:“丽莎·辛普森”,
电邮:'lisa@email.com',
最喜欢的运动:“游泳”
},
{
姓名:“丽莎·辛普森”,
电邮:'lisa@email.com',
最喜欢的运动:“排球”
},
{
姓名:艾尔·帕辛
var app = (function() {
var init = function() {
combineDuplicateEntries(data);
};
data = [
{
name: 'Lisa Simpson',
email: 'lisa@email.com',
favoriteSport: 'Soccer'
},
{
name: 'Lisa Simpson',
email: 'lisa@email.com',
favoriteSport: 'Tennis'
},
{
name: 'Lisa Simpson',
email: 'lisa@email.com',
favoriteSport: 'Swimming'
},
{
name: 'Lisa Simpson',
email: 'lisa@email.com',
favoriteSport: 'Voleyball'
}
];
var finalData = {};
function combineDuplicateEntries(data) {
if (Array.isArray(data)) {
console.log('Data is an array.');
findDulicates(data)
}
}
function findDulicates(data) {
var duplicate = false;
data.map(function(item) {
var emailProperty = item.email;
var favoriteSport = item.favoriteSport;
if (emailProperty in finalData) {
if (!finalData[emailProperty].duplicate) {
finalData[emailProperty].favoriteSports = [];
}
finalData[emailProperty].duplicate = true;
finalData[emailProperty].favoriteSports.push(favoriteSport)
if (finalData[emailProperty].favoriteSport) {
finalData[emailProperty].favoriteSports.push(finalData[emailProperty].favoriteSport);
delete finalData[emailProperty].favoriteSport
}
duplicate = true;
} else {
finalData[emailProperty] = item;
delete item.duplicate;
}
return duplicate;
});
console.log("Final data: ", finalData);
}
return init();
});
app();