我下面有两个结构相似的数组,除了数组1
中的附加键之外,当我得到数组2
时,如果它们是重复的,我想从数组2
中删除重复项已经存在于数组1
中。
例如第二个项是重复项。
[{
"from": "1",
"to": "2",
"text": "test",
"_goid": "1234"
}, {
"from": "3",
"to": "4",
"text": "test",
"_goid": "12345"
}, {
"from": "5",
"to": "6",
"text": "test",
"_goid": "123456"
}]
_goid
)[{
"from": "4",
"to": "8",
"text": "test"
},{
"from": "3",
"to": "4",
"text": "test"
},{
"from": "9",
"to": "10",
"text": "test"
}]
我有下面的代码,如果数组完全相同但不适用于我的情况,它将删除重复项。
function removeDuplicatesJson(myArr) {
var props = Object.keys(myArr[0])
return myArr.filter((item, index, self) =>
index === self.findIndex((t) => (
props.every(prop => {
return t[prop] === item[prop]
})
))
)
}
答案 0 :(得分:0)
我不确定这是否是您想要的,但它可能会对您有所帮助。
1。 选项更快但数量有限(取决于数据量),只有在您确定对象签名时,属性的顺序才重要:
const removeDuplicates = (baseArray, toDedupe) => {
const baseArrayFormatted = baseArray.map(({ _goid, ...restProps }) => JSON.stringify(restProps));
return toDedupe
.map(item => JSON.stringify(item))
.filter((item) => !baseArrayFormatted.some(baseItem => baseItem === item))
.map(item => JSON.parse(item));
}
2。 速度较慢但更准确:
const removeDuplicates = (baseArray, toDedupe) => {
const props = Object.keys(toDedupe[0]);
return toDedupe
.filter((item) => !baseArray.some(baseItem => props.every(prop => baseItem[prop] === item[prop])))
}
请记住,没有检查对象签名,也缺少大量的验证(如果它确实是一个对象,如果它是一个函数等,但我认为这不是问题)。
答案 1 :(得分:0)
以下代码将按照您的要求进行操作:从arr2
中删除arr1
中已经存在的所有项目:
var arr1 = [{
"from": "1",
"to": "2",
"text": "test",
"_goid": "1234"
}, {
"from": "3",
"to": "4",
"text": "test",
"_goid": "12345"
}, {
"from": "5",
"to": "6",
"text": "test",
"_goid": "123456"
}]
var arr2 = [{
"from": "4",
"to": "8",
"text": "test"
},{
"from": "3",
"to": "4",
"text": "test"
},{
"from": "9",
"to": "10",
"text": "test"
}]
// create a flat array of values to test against:
var arr1_keys = arr1.map(item => item.from + item.to);
// ["12", "34", "56"]
// filter out the dups and create a dup-free array
arr2 = arr2.filter(item => !arr1_keys.includes(item.from + item.to))
console.log(arr2)