Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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_Data Structures_Mapreduce_Reduce - Fatal编程技术网

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

给定以下对象数组,我如何创建一个新的数组,其中如果有一个对象具有相同的电子邮件,它只需将favoriteSport添加到数组中即可。我想要实现的是删除重复数据

关于如何在Javascript中解决这个问题,有什么建议吗

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();