JS JSON数组比较数组并删除重复项

时间:2018-09-07 06:57:05

标签: javascript arrays json

我下面有两个结构相似的数组,除了数组1中的附加键之外,当我得到数组2时,如果它们是重复的,我想从数组2中删除重复项已经存在于数组1中。

例如第二个项是重复项。

数组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"
}]

数组2 :(唯一的区别是它不包含键_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]
      })
    ))
    )
}

2 个答案:

答案 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)