检查angular2中对象数组中的重复值

时间:2018-08-16 11:39:28

标签: angular

我有一项要求,我只需要检查对象数组中的重复描述。下面是对象示例。

traveler = [
   {  description: 'Senior', Amount: 50},
   {  description: 'Senior', Amount: 10},
   {  description: 'Adult', Amount: 75},
   {  description: 'Child', Amount: 35},
   {  description: 'Infant', Amount: 25 },
   {  description: 'Adult', Amount: 105},
];

在上面的数组行进器中,有一些对象具有重复的描述,因此如何只检查整个数组中是否存在重复的描述并显示一条消息。

我正在使用reduce方法,下面是代码。但是控件没有进入if循环

我在哪里出错了?

var res = traveler.reduce((acc, obj)=>{
         var existItem = acc.find(item => item.description === obj.description);
            if(existItem){
                return this.toaster.pop('info', 'Insertion unsuccessful', 'Duplicate answer found')
            } 
           });

5 个答案:

答案 0 :(得分:2)

删除reduce并仅使用filter

let existItem = traveler.filter(item => item.description === obj.description);
if (existItem.length > 1) {
    return this.toaster.pop('info', 'Insertion unsuccessful', 'Duplicate answer found')
}

答案 1 :(得分:1)

您可以编写代码:

var traveler = [
  {
    description: "Senior",
    Amount: 50
  },
  {
    description: "Senior",
    Amount: 10
  },
  {
    description: "Adult",
    Amount: 75
  },
  {
    description: "Child",
    Amount: 35
  },
  {
    description: "Infant",
    Amount: 25
  },
  {
    description: "Adult",
    Amount: 105
  }
];

function hasDuplicateDesc(collection) {
  var groups = collection.reduce((acc, cur) => {
    acc[cur.description] = (acc[cur.description] || 0) + 1;
    return acc;
  }, {});

  return Object.values(groups).some(num => num > 1);
}

if (hasDuplicateDesc(traveler)) {
  return this.toaster.pop(
    "info",
    "Insertion unsuccessful",
    "Duplicate answer found"
  );
}

groups是一个基本上创建对象的对象:

{
  "Senior": 2,
  "Adult": 2,
  "Child": 1,
  "Infant": 1
}

我们使用Object.values(groups)来获取对象的值,并检查是否有一个比1更好的数字。如果存在任何num > 1,那么我们可以说存在重复的描述。

答案 2 :(得分:1)

该控件不会进入if块内,因为您没有将任何内容推入$("#field2").text("text here");中(并且您没有在reduce的最后一个参数中对其进行初始化),reduce操作将不会执行此操作你。

此解决方案应该有效:

acc

var res = traveler.reduce((acc, obj)=> { var existItem = acc.find(item => item.description === obj.description); if(existItem) { return this.toaster.pop( 'info', 'Insertion unsuccessful', 'Duplicate answer found' ); } acc.push(obj); return acc; }, []); 将包含唯一值,并且res会通知您重复项。 但是,您也可以通过将其放入if块内的重复列表中来保留重复项。

答案 3 :(得分:1)

尝试一下。

reduce(){
   let res=[];
   this.traveler.map(function(item){
     var existItem = res.find(x=>x.description==item.description);
     if(existItem)
      console.log("item already exist");
     else
      res.push(item);
   });
   console.log(res);
 }

答案 4 :(得分:0)

在这里,我试图找出阵列中重复的电子邮件。 我有 enteredEmails 数组,其中包含可能唯一或重复的电子邮件列表。

请找到以下示例。


this.enteredEmails.forEach(emailItr => {

      matchedEmail = [];
      matchedEmail = this.enteredEmails.filter((val) => val.emailId === emailItr.emailId);

      if (matchedEmail.length > 1) {
        return this.isDuplicate = true;

      }

    });

}