【问题标题】:Separate the repeated occurring elements and unique elements from a given array to two new arrays containing unique elements and recurring elements将给定数组中重复出现的元素和唯一元素分离为两个包含唯一元素和重复元素的新数组
【发布时间】:2020-07-15 05:52:14
【问题描述】:

有人能帮我解答这个问题吗? 给定一个对象数组,我们需要根据将数组中重复和不重复的对象拆分成一个独立数组例如-

[ {name:"abc",id:1,segments:[1,2]}, {name:"abc1",id:2,segments:[1]}, {name:"abc3",id :3,段:[1,2]}, {name:"abc2",id:4,segments:[1,2,3]} ]

所需的结果数组如下 -

uniqueArr = [{ name:"abc1",id:2,segments:[1]},{ name:"abc2",id:4,segments:[1,2,3]}]

  • 以上示例用于给定数组中的非重复对象

repeatedEle = [[{ name:"abc",id:1,segments:[1,2]},{ name:"abc3",id:3,segments:[1,2]}]]

  • 以上示例用于根据相同段的出现次数重复给定数组中的对象。
  • 重复元素必须位于嵌套数组内。

【问题讨论】:

    标签: javascript arrays algorithm object data-structures


    【解决方案1】:

    所以你想根据段属性分隔数组?

    注意:这不是性能优化的解决方案,但对于小型阵列,这应该没问题。

    const data = [
      {name:"abc",id:1,segments:[1,2]},
      {name:"abc1",id:2,segments:[1]},
      {name:"abc3",id:3,segments:[1,2]},
      {name:"abc2",id:4,segments:[1,2,3]},
    ];
    
    const uniqueData = data.filter((entry, idx, originalArray) => {
      const copyArray = [...originalArray];
      copyArray.splice(idx, 1);
      
      return !copyArray.some((element) => entry.segments.sort().join() === element.segments.sort().join());
    });
    
    const nonUniqueData = data.filter((entry) => !uniqueData.includes(entry));
    
    console.log({uniqueData, nonUniqueData});

    这是另一种解决方案。

    const data = [
      {name:"abc",id:1,segments:[1,2]},
      {name:"abc1",id:2,segments:[1]},
      {name:"abc3",id:3,segments:[1,2]},
      {name:"abc2",id:4,segments:[1,2,3]},
    ];
    
    const segmentedData = data.reduce((acc, entry, idx, src) => {
    
      const copyArray = [...src];
      copyArray.splice(idx, 1);
      
      const key = copyArray.some((element) => entry.segments.sort().join() === element.segments.sort().join()) ? 'nonunique' : 'unique';
      
      acc[key].push(entry);
      
      return acc;
    
    }, { unique: [], nonunique: [] });
    
    console.log(segmentedData);

    【讨论】:

    • 这个解决方案对我来说很好用。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    • 1970-01-01
    • 2017-06-07
    • 2020-04-14
    相关资源
    最近更新 更多