javascript - 使用纯 Javascript 或 Typescript 删除数组中的重复项

标签 javascript arrays typescript duplicates

我似乎只能找到使用其他 JS 库从数组中删除重复项的方法,但我希望在纯 JS 或 typescript 中做到这一点,因为我正在开发一个 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;
})

最佳答案

您可以通过以下方式实现您想要的:

您可以使用 '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)
    }
})

您还可以通过 'reduce' 来实现此目的以干净优雅的方式:

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

正如 @Ezequiel 所建议的,在 forEach 中使用 somereduce 使时间复杂度达到 n 平方级>。对于较小的数据集,使用 reducesome 是一种优雅的方法。但是,如果您正在处理非常大长度的数组,则必须避免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
    }
)

关于javascript - 使用纯 Javascript 或 Typescript 删除数组中的重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52514026/

相关文章:

jquery - 编译最后一个 jquery 声明文件时出现 typescript 错误 : jquery. d.ts (164,59):预期为 '{'

javascript - 有没有一种干燥的方法可以做到这一点?

javascript - 英特尔 XDK 警报 API 不起作用

javascript - lodash:组合对象数组

javascript - 求数组之和 - Javascript

typescript - Angular2 应用范围变量

typescript - 使用 Webpack 2 和 awesome-typescript-loader 的 baseUrl 和路径解析

c# - 每个服务器端事务的加载程序

javascript - 错误 - 'bower install' 失败,退出状态为 1

c++ - 如何截断字符串数组? C++