首页 > 解决方案 > 使用纯 Javascript 或 Typescript 删除数组中的重复项

问题描述

我似乎只能找到使用其他 JS 库从数组中删除重复项的方法,但我希望在纯 JS 或打字稿中做到这一点,因为我正在处理一个 Angular 项目。

我的问题是我可能会得到一个包含重复条目的数组,例如这个:

data [0: {Id: 1, Definition: "House"},
      1: {Id: 1, Definition: "House"}]

我想过滤掉它,这样我只得到

data [0: {Id: 1, Definition: "House"}]

我已经尝试过使用这种方法,但我仍然得到重复的条目

let uniqueArray = data.filter(function(item, pos) {
    return data.indexOf(item) == pos;
})

标签: javascriptarraystypescriptduplicates

解决方案


你可以通过这种方式实现你想要的:

您可以使用“some”检查最终数组中是否已经存在该值

data = [{Id: 1, Definition: "House"}, {Id: 1, Definition: "House"}]

const finalOut = []
data.forEach((value) => {
    if (!finalOut.some(x=> (x.Id === value.Id || x.Definition === value.Definition))) 
   {
        finalOut.push(value)
    }
})

你也可以通过简洁优雅的方式“减少”来实现这一点:

const finalOut2 = data.reduce((acc, cur) => acc.some(x=> (x.Id === cur.Id || x.Definition === cur.Definition)) ? acc : acc.concat(cur), [])

正如@Ezequiel 所建议的那样,使用someinsideforEachreduce使时间复杂度为 n square。对于较小的数据集,使用reduceandsome是一种优雅的方法。但是,如果您正在处理长度非常大的数组,则必须避免n 平方时间复杂度的顺序这是一种这样的方法filter

//Here storing every value of data is inside lookupObj after filtering it. 
//And checking if value is filtered based on if key of the value inside lookupObj

const lookupObj = {} 
const finalOut3 = data.filter(
    x => {
        const is_unique = !(lookupObj[`Id_${x.Id}`] || lookupObj[`Id_${x.Definition}`])
        lookupObj[`Id_${x.Id}`] = true
        lookupObj[`Id_${x.Definition}`] = true
        return is_unique
    }
)

推荐阅读