typescript 从Array中移除重复对象

huwehgph  于 2022-11-26  发布在  TypeScript
关注(0)|答案(4)|浏览(288)

我有一个带有重复对象的数组,我想删除这些重复对象。但是我似乎找不到合适的解决方案。我在这里犯了什么错误?
对象如下。

{name: "login", text: "Login"}
{name: "navigation", text: "Navigation"}
{name: "landing", text: "Landing Page"}
{name: "login", text: "Login"}
{name: "navigation", text: "Navigation"}
{name: "landing", text: "Landing Page"}

下面是我的代码,其中items包含对象数组。

this.subMenuItems = this.items.reduce((acc, current) => {
  const x = acc.find(item => item.name === current.name);
  if (!x) {
    return acc.concat([current]);
  } else {
    return acc;
  }
}, []);

您还可以参考items变量

的Console.log的屏幕截图

gdrx4gfi

gdrx4gfi1#

这个函数将为this.subMenuItems分配一个只包含每个项的第一个示例的数组,因为indexOf返回找到该对象的第一个索引。

this.subMenuItems = this.items.filter((item, index, self) => self.indexOf(item) === index);
ymdaylpp

ymdaylpp2#

问题

您的代码的问题是find将始终返回一个定义的值,因为至少有一个对象满足条件(current对象本身)

溶液

其中一个解是@Issac给出的解,其时间复杂度和空间复杂度分别为O(n^2)O(1)
还有一个时间和空间复杂度分别为O(n)O(n)的解。

function removeDuplicates(objects) {
  const map = new Map()

  for (const obj of objects) {
    map.put(obj.name, obj)
  }

  return map.values()
}
axr492tv

axr492tv3#

请在下面找到一个可以返回重复项列表或删除重复项列表的函数。

identifyDuplicates(data: Object[], key: string, unique: boolean = 
true) {
    const unique: Object[] = [];
    const duplicates = data.filter(x => {
        if (unique.length > 0 && (unique?.find(u => u[key] == x[key]) != null)) 
    {  return true; }
        unique.push(x);
        return false;
    });
    return unique ? unique : duplicates;
}

可以通过两种方式调用它:

public getUnique(data: Object[], key: string) {
    return this.identifyDuplicates(data, key);
}

public getDuplicate(data: Object[], key: string) {
    return this.identifyDuplicates(data, key, false);
}

对于您的情况:

const unique = this.getUnique(this.subMenuItems, 'name');
console.log(JSON.stringify(unique ));

如果要获取重复项

const duplicates = this.getDuplicate(this.subMenuItems, 'name');
console.log(JSON.stringify(duplicates));
7fyelxc5

7fyelxc54#

function solve(items) {
    var m = {}
    items.forEach((obj) => {
        var name = obj.name;
        var text = obj.text;
        if (!m[name]) {
            m[name] = new Set();
        }
        m[name].add(text);

    });
    var finalItemsList = [];
    Object.keys(m).forEach((name) => {
        Array.from(m[name]).forEach((text) => {
            finalItemsList.push({
                "name": name,
                "text": text
            })
        });

    });
    return finalItemsList;

}
console.log(items);

相关问题