JavaScript中如何根据条件从对象数组中删除重复对象

sg2wtvxw  于 2023-05-05  发布在  Java
关注(0)|答案(2)|浏览(125)

我有一个对象数组,我想根据“documentTypeId”和“flag”值删除重复的对象。在下面的对象中,我想删除具有'documentTypeId'值相同且标志值为false的对象。我试过了,但没有找到合适的过滤器。请找到下面的代码。

const test = [{
    "id": 100,
    "documentTypeId": 3,
    "docName": "test",
    "flag": false
  }, {
    "id": 31184688089,
    "documentTypeId": 1,
    "docName": "test2",
    "flag": true
  },
  {
    "documentTypeId": 3,
    "docName": "test3",
    "flag": true,
    "active": true
  }
]
const res = test.filter((value, index, self) =>
  index === self.findIndex((t) => (
    t.documentTypeId === value.documentTypeId && t.flag == false
  ))
)
console.log(res);
11dmarpk

11dmarpk1#

我不知道你的目标是什么。你可能问错问题了。我想你可能会看到的是从一个基于标志documentTypeIdflag的数组中删除重复项,另一个条件是,如果有重复项,你希望优先选择具有flag=true的文档。
您可以尝试将所有documentTypeId排列在一个数组中,并以boolean作为第一个元素对它们进行排序,然后在排序后选择所有documentTypeId的第一个元素。比如下面

const filterFn = (arr) => Object.values(
    arr.reduce((acc, cur) => ({
      ...acc,
      [cur.documentTypeId]: [...acc[cur.documentTypeId] || [], cur]
    }), {}))
  .map(i => i.sort(({flag: a}, {flag: b}) => Number(b) - Number(a))[0]);
const test1 = [{
    "id": 100,
    "documentTypeId": 3,
    "docName": "test",
    "flag": false
  }, {
    "id": 31184688089,
    "documentTypeId": 1,
    "docName": "test2",
    "flag": true
  },
  {
    "documentTypeId": 3,
    "docName": "test3",
    "flag": true,
    "active": true
  }
]

const test2 = [{
    "docName": "test1",
    "active": true,
    "documentTypeId": 3,
    "flag": false
  },
  {
    "docName": "test2",
    "active": true,
    "documentTypeId": 1,
    "flag": false
  },
  {
    "docName": "test3",
    "documentTypeId": 5,
    "id": 5,
    "flag": false
  },
  {
    "docName": "test4",
    "active": true,
    "documentTypeId": 16,
    "flag": false
  },
  {
    "docName": "test5",
    "documentTypeId": 16,
    "id": 102,
    "flag": true
  }
]
const filterFn = (arr) => Object.values(
    arr.reduce((acc, cur) => ({
      ...acc,
      [cur.documentTypeId]: [...acc[cur.documentTypeId] || [], cur]
    }), {}))
  .map(i => i.sort(({flag: a}, {flag: b}) => Number(b) - Number(a))[0]);

console.log(filterFn(test1));
console.log(filterFn(test2));

如果这不是你的问题,那么你的downvoting和unmarking答案不是StackOverflow的方法。人们在这里帮助你,而不是免费工作。这是我最后一次尝试,因为我不像Stackoverflow的传奇人物那样相当谦虚:)

aydmsdu9

aydmsdu92#

const data = [
  {
    "id": 100,
    "documentTypeId": 3,
    "docName": "test",
    "flag": false
  }, {
    "id": 31184688089,
    "documentTypeId": 1,
    "docName": "test2",
    "flag": true
  },
  {
    "documentTypeId": 3,
    "docName": "test3",
    "flag": false,
    "active": true
  }
];

let typeMem = [];
let filtered = data.filter(({ flag: f, documentTypeId: d }) => 
  f || (typeMem[d] = (typeMem[d] || 0) + 1) && typeMem[d] < 2);

console.log(filtered);

相关问题