【问题标题】:Remove duplicates from nested array as well as from parent array从嵌套数组和父数组中删除重复项
【发布时间】:2020-09-18 17:15:44
【问题描述】:

您好,我正在尝试使用 id 从父数组和嵌套对象数组中删除重复项,但如果父 id 为空,则该对象应包含那些空 id 并删除其他重复的, 但是为空的 id 在嵌套数组中也有重复值,需要删除

这里是对象数组示例:

const arr = [{
    id: 6652,
    value: "erger",
    compositField: []
  },
  {

    id: 6652,
    value: "sdfs",
    compositField: []
  },
  {

    id: 6653,
    value: "sdgdfg",
    compositField: []
  },
  {

    id: 6000,
    value: "trgd",
    compositField: []
  },
  {

    id: 6667,
    value: "asdf",
    compositField: []
  },
  {

    id: 6667,
    value: "fdg",
    compositField: []
  },
  {

    id: 6668,
    value: "dfgr",
    compositField: []
  },
  {

    id: null,
    value: "fg",
    compositField: [{
        id: null,
        compositeId: 100,
        value: 'test1'
      },
      {
        id: null,
        compositeId: 100,
        value: 'test2'
      },
    ]
  },
  {

    id: null,
    value: "dfgdf",
    compositField: [{
        id: null,
        compositeId: 100,
        value: 'test3'
      },
      {
        id: null,
        compositeId: 100,
        value: 'test4'
      },
    ]
  },

  {

    id: null,
    value: "fg",
    compositField: [{
        id: null,
        compositeId: 101,
        value: 'test1'
      },
      {
        id: null,
        compositeId: 101,
        value: 'test2'
      },
    ]
  },
  {

    id: null,
    value: "dfgdf",
    compositField: [{
        id: null,
        compositeId: 101,
        value: 'test3'
      },
      {
        id: null,
        compositeId: 101,
        value: 'test4'
      },
    ]
  },
  {

    id: null,
    value: "fg",
    compositField: [{
        id: null,
        compositeId: 103,
        value: 'test1'
      },
      {
        id: null,
        compositeId: 103,
        value: 'test2'
      },
    ]
  },
  {

    id: null,
    value: "dfgdf",
    compositField: [{
        id: null,
        compositeId: 103,
        value: 'test3'
      },
      {
        id: null,
        compositeId: 103,
        value: 'test4'
      },
    ]
  },

];

以下是最终的o/p结果:

const arr = [{

    id: 6652,
    value: "sdfs",
    compositField: []
  },
  {

    id: 6653,
    value: "sdgdfg",
    compositField: []
  },
  {

    id: 6000,
    value: "trgd",
    compositField: []
  },

  {

    id: 6667,
    value: "fdg",
    compositField: []
  },
  {

    id: 6668,
    value: "dfgr",
    compositField: []
  },
  {

    id: null,
    value: "fg",
    compositField: [{
        id: null,
        compositeId: 100,
        value: 'test1'
      },
      {
        id: null,
        compositeId: 100,
        value: 'test2'
      },
    ]
  },
  {

    id: null,
    value: "dfgdf",
    compositField: [{
        id: null,
        compositeId: 100,
        value: 'test3'
      },
      {
        id: null,
        compositeId: 100,
        value: 'test4'
      },
    ]
  },
];

在上述结果中,6652 和 6667 被删除,因为它们是重复的,但 null id 被保留,因为我不想删除 null id 并删除其他重复值。

但是为空的 id 也像 CompositeId: 101 和 CompositeId: 103 一样重复 --> 这些重复项需要通过对名称进行组合映射来删除,因为名称在嵌套的复合字段中像“test1”、test2 等一样重复。数组,

注意:我想从嵌套数组中删除带有名称的重复项,因为 compositField 是动态值,因此需要与名称对应。

尝试以下方法:

let index = 0;
const finalResultData = Object.values(
  finalData.reduce(
    (a, c) =>
    c.id === null ?
    { ...a,
      [index++]: c
    } :
    { ...a,
      [c.id]: c
    }, {}
  )
);

【问题讨论】:

  • 让索引 = 0; const finalResultData = Object.values( finalData.reduce( (a, c) => c.id === null ? { ...a, [index++]: c } : { ...a, [c.id] : C }, {} ) );这将仅删除不在嵌套数组中重复的 id
  • 您是指name value 属性吗?
  • @NinaScholz compositeId: 100, value: 'test3' --> name yes

标签: javascript angular


【解决方案1】:

您可以将嵌套数组中的值作为键的一部分。

const
    array = [{ id: 6652, value: "erger", compositField: [] }, { id: 6652, value: "sdfs", compositField: [] }, { id: 6653, value: "sdgdfg", compositField: [] }, { id: 6000, value: "trgd", compositField: [] }, { id: 6667, value: "asdf", compositField: [] }, { id: 6667, value: "fdg", compositField: [] }, { id: 6668, value: "dfgr", compositField: [] }, { id: null, value: "fg", compositField: [{ id: null, compositeId: 100, value: 'test1' }, { id: null, compositeId: 100, value: 'test2' }] }, { id: null, value: "dfgdf", compositField: [{ id: null, compositeId: 100, value: 'test3' }, { id: null, compositeId: 100, value: 'test4' }] }, { id: null, value: "fg", compositField: [{ id: null, compositeId: 101, value: 'test1' }, { id: null, compositeId: 101, value: 'test2' }] }, { id: null, value: "dfgdf", compositField: [{ id: null, compositeId: 101, value: 'test3' }, { id: null, compositeId: 101, value: 'test4' }] }, { id: null, value: "fg", compositField: [{ id: null, compositeId: 103, value: 'test1' }, { id: null, compositeId: 103, value: 'test2' }] }, { id: null, value: "dfgdf", compositField: [{ id: null, compositeId: 103, value: 'test3' }, { id: null, compositeId: 103, value: 'test4' }] }],
    result = Object.values(array.reduce((r, o) => {
        if (o.id === null) {
            const key = [o.value, ...o.compositField.map(({ value }) => value)].join('|');
            if (!r[key]) r[key] = o;
        } else {
            r[`|${o.id}`] = o; // prevent numerical key, maintain order
        }
        return r;
    }, {}));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

    猜你喜欢
    • 2021-08-23
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    • 2011-01-04
    相关资源
    最近更新 更多