【问题标题】:Check the duplicate objects in array检查数组中的重复对象
【发布时间】:2019-07-25 18:41:43
【问题描述】:

我正在尝试在对象数组中查找重复值并在 es6 函数中返回真值。

arrayOne = [{
    agrregatedVal: "count",
    value: "Employee Full Name"
  },
  {
    agrregatedVal: "min",
    value: "Employee Full Name"
  },
  {
    agrregatedVal: "min",
    value: "Employee Full Name"
  },
  {
    agrregatedVal: "count",
    value: "Pay Date"
  },
  {
    agrregatedVal: "count",
    value: "Employee Full Name"
  },
  {
    agrregatedVal: "min",
    value: "Signature"
  },
  {
    agrregatedVal: "min",
    value: "Pay Date"
  }]
  
  

以上是json的结构

这里我有两个重复的对象:

{
  agrregatedVal: "min",
  value: "Employee Full Name"
}, {
  agrregatedVal: "min",
  value: "Employee Full Name"
}

不关心剩余的,因为每个对象的两个值都不同。

如果每个对象值与同一数组的另一个对象重复,则它应该返回 true。

我是这样尝试的:-

this.arrayOne = this.arrayOne.filter((thing, index, self) => {
  return index === self.findIndex((t) => {
    return t.agrregatedVal === thing.agrregatedVal && t.value === thing.value;
  });
});

它起作用了,如果每个值的对象与另一个对象相同,如何返回 true。

【问题讨论】:

  • 你永远不会从你的回调函数中返回任何东西。应该是return index === ...,或者你应该去掉花括号。
  • 我试图删除花括号它仍然对我有用
  • 您也必须对内部回调执行相同的操作。 jsfiddle.net/twox60dm
  • 它删除重复值并返回数组,但我只需要布尔值而不是数组
  • 哪个布尔值?清楚地解释你的方法应该做什么:“我的方法应该在......时返回true”。您发布的代码创建了一个过滤数组。

标签: angular typescript


【解决方案1】:

这里有几件事:

1) 有重复:

它起作用了,如果每个值的对象与另一个对象相同,如何返回true。

const dict=arrayOne.map((item,pos)=>{
  return item.agrregatedVal+":"+item.value;
});


hasDuplicate=dict.some(function(item, id){ 
     if(dict.indexOf(item) != id)
       return item;
});

console.log(hasDuplicate);

2) 删除重复项:

 unique = [...new Set(arrayOne.map(a => a.agrregatedVal+ "':'"+ a.value))];

现在,你可以用这些来构造你的对象

【讨论】:

    【解决方案2】:

    试试这个:

    const arrayOne = [{
        agrregatedVal: "count",
        value: "Employee Full Name"
      },
      {
        agrregatedVal: "min",
        value: "Employee Full Name"
      },
      {
        agrregatedVal: "min",
        value: "Employee Full Name"
      },
      {
        agrregatedVal: "count",
        value: "Pay Date"
      },
      {
        agrregatedVal: "count",
        value: "Employee Full Name"
      },
      {
        agrregatedVal: "min",
        value: "Signature"
      },
      {
        agrregatedVal: "min",
        value: "Pay Date"
      }]
    
    function hasDuplicate(arrayOne) {
      const newArray = arrayOne.filter((thing, index, self) => index === self.findIndex(t => t.agrregatedVal === thing.agrregatedVal && t.value === thing.value));
    
      return newArray.length < arrayOne.length;
    }
    
    console.log(hasDuplicate(arrayOne));
    

    如果有重复,hasDupliecate 将返回 true

    【讨论】:

      【解决方案3】:

      对数组进行重复数据删除

      考虑以下实现:

      const initialArray = [
        {agrregatedVal: "count", value: "Employee Full Name"},
        {agrregatedVal: "min", value: "Employee Full Name"},
        {agrregatedVal: "min", value: "Employee Full Name"},
      ];
      
      const dedupedArray = [
        ...new Set(initialArray.map(item => JSON.stringify(item)))
      ].map(itemJson => JSON.parse(itemJson));
      
      console.log(dedupedArray);
      1. 原始数组中的每一项都转换为Json字符串
      2. 字符串被转储到 Set 中,该 Set 会丢弃重复项
      3. Set,现在只包含唯一的 Json 字符串,被转换回一个数组
      4. 从字符串重新创建对象

      判断一个对象是否在数组中重复的函数

      我认为你真正想要实现的是有一个函数来确定一个对象是否是数组中另一个对象的副本,对吧?

      const array = [
        {agrregatedVal: "count", value: "Employee Full Name"},
        {agrregatedVal: "min", value: "Employee Full Name"},
        {agrregatedVal: "min", value: "Employee Full Name"},
      ];
      
      const isDuplicate = (itemA, array) => !!array.find(itemB => itemA !== itemB && JSON.stringify(itemA) === JSON.stringify(itemB));
      
      console.log(isDuplicate(array[1], array))

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-23
        • 2018-01-07
        相关资源
        最近更新 更多