我似乎只能找到使用其他 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
中使用 some
或 reduce
使时间复杂度达到 n 平方级>。对于较小的数据集,使用 reduce
和 some
是一种优雅的方法。但是,如果您正在处理非常大长度的数组,则必须避免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/