【问题标题】:Remove duplicate objects from an array with Keys使用键从数组中删除重复的对象
【发布时间】:2022-01-03 14:35:06
【问题描述】:

如何按属性过滤对象数组?例如,在这个数组中,如果两个或多个对象具有相同的属性,如 name 和 lastname 我想删除其中任何一个并在数组中只留下唯一的一个。示例 arr:

    [ {name: "George", lastname: "GeorgeLast", age: 12},
      {name: "George", lastname: "GeorgeLast", age: 13},
      {name: "Bob", lastname: "GeorgeLast", age: 12}] 

结果应该是

 [ {name: "George", lastname: "GeorgeLast", age: 13},
   {name: "Bob", lastname: "GeorgeLast", age: 12}]

或

 [ {name: "George", lastname: "GeorgeLast", age: 12},
   {name: "Bob", lastname: "GeorgeLast", age: 12}]

【问题讨论】:

    标签: javascript arrays typescript object data-structures


    【解决方案1】:

    应用this answer中显示的技术,即:

    function onlyUnique(value, index, self) {
      return self.indexOf(value) === index;
    }
    

    ...但是使用带有某些标准的findIndex 而不仅仅是indexOf。

    let people = [
      { name: "George", lastname: "GeorgeLast", age: 12 },
      { name: "George", lastname: "GeorgeLast", age: 13 },
      { name: "Bob", lastname: "GeorgeLast", age: 12 }
    ]
    
    let result = people.filter(
      (person, index) => index === people.findIndex(
        other => person.name === other.name
          && person.lastname === other.lastname
      ));
    console.log(result);

    至于是保留12岁的乔治还是13岁的乔治,这取决于findIndex如何工作,恰好返回第一个匹配元素。因此,在您的示例中,它将保留 12 岁的乔治。

    【讨论】:

      【解决方案2】:

      另一种解决方案。
      在这里,您不需要遍历列表 n*n/2 次(如果我计数正确的话)。
      另一方面,这个看起来不那么简洁并且使用更多的内存。
      使用您喜欢的任何一个。

      const arr = [
        {name: "George", lastname: "GeorgeLast", age: 12},
        {name: "George", lastname: "GeorgeLast", age: 13},
        {name: "Bob", lastname: "GeorgeLast", age: 12}
      ];
      
      const obj = {}
      arr.forEach(v => {
        if (!obj[v.name]) {
          obj[v.name] = {}
        }
        if (!obj[v.name][v.lastname]) {
          obj[v.name][v.lastname] = v;
        }
      })
      
      const result = [];
      Object.values(obj).forEach(nameObj =>
        Object.values(nameObj).forEach(surnObj => result.push(surnObj))
      );
      
      console.log(result)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-23
        • 2013-10-30
        • 2021-07-01
        相关资源
        最近更新 更多