javascript - 使用纯 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;
})
解决方案
你可以通过这种方式实现你想要的:
您可以使用“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 所建议的那样,使用some
insideforEach
或reduce
使时间复杂度为 n square。对于较小的数据集,使用reduce
andsome
是一种优雅的方法。但是,如果您正在处理长度非常大的数组,则必须避免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
}
)
推荐阅读
- reactjs - 启用基于菜单链接的用户身份验证在 reactjs 中不起作用
- flutter - Flutter WebRTC 无法连接到对等点。无法设置远程应答 sdp:在错误状态下调用:kStable
- python - read_pdf FileNotFoundError:[Errno 2] 没有这样的文件或目录:在 Python 中
- c++ - 是否可以在 C++ 中的类和向量中存储一个 unique_ptr?
- c# - 是否可以在 WPF 的 MultiBinding QuickConverter 中使用带有参数的经典转换器?
- c - 如何用strtok函数替换字符-C?
- firebase - 理解 Firestore 安全规则 - 只允许更新某些字段
- python - 如何从python中的字符串中提取月份和年份?
- oauth-2.0 - 使用 EWS、OAuth2 和用户凭据访问用户邮箱
- reactjs - React 应用程序变慢并且 JS Heap 变大。如何发现内存泄漏?