查找重复项并将其替换为具有相同索引位置的新数组

Posted

技术标签:

【中文标题】查找重复项并将其替换为具有相同索引位置的新数组【英文标题】:Find duplicates and replace it on new arrays with the same index position 【发布时间】:2021-09-18 00:46:57 【问题描述】:

我需要通过键值“groupName”找到相同的元素,并在新数组中的相同索引位置上创建一组,如果 groupName 为空,则将其保留在相同位置

例如:

const list = [
    
        id: 1,
        groupName: null
    ,

    
        id: 2,
        groupName: 'group_1'
    ,

    
        id: 3,
        groupName: 'group_1'
    ,

    
        id: 4,
        groupName: 'group_2'
    ,

    
        id: 5,
        groupName: 'group_2'
    ,

    
        id: 6,
        groupName: null
    ,
    ...
];

期待这样的事情:

const newList = [
        
        id: 1,
        groupName: null
    ,

    [
        
            id: 2,
            groupName: 'group_1'
        ,

        
            id: 3,
            groupName: 'group_1'
        
    ],

    [
        
            id: 4,
            groupName: 'group_2'
        ,

        
            id: 5,
            groupName: 'group_2'
        
    ],

    
        id: 6,
        groupName: null
    ,
];

我尝试为此使用 reduce,但无法在 newList 中保存相同的索引位置 这样做的最佳方法是什么?

【问题讨论】:

我认为您应该对项目进行分组,即使 groupName 为 null 以保持一致的数据结构。 输入没有按组排序怎么办? “相同的索引位置”是什么意思?例如 id: 4, groupName: 'group_2' 的对象在list[3]newList[2][0];两个数组的索引不一样。 @secan 是的,我明白你的意思。它应该看起来像示例中的样子,猜猜它提供的信息更多。我的意思是在循环期间,相等的对象应该包装在新数组中。但当然,索引会有所不同,谢谢通知。 @ikhvjs 是的,我认为你是绝对正确的。但它应该在一个循环列表中......并且位置很重要......也许我需要创建一个不同的结构但在一个范围内...... 【参考方案1】:

[编辑]根据您的最后评论,如果您还想对groupNamenull 的对象进行分组,您只需修改我之前发布的代码

const list = [
   id: 1, groupName: null ,
   id: 2, groupName: 'group_1' ,
   id: 3, groupName: 'group_1' ,
   id: 4, groupName: 'group_2' ,
   id: 5, groupName: 'group_2' ,
   id: 6, groupName: null ,
];

const newList = list.reduce((acc, item) => 
  const arr = acc.find(_item => Array.isArray(_item) && _item[0].groupName === item.groupName);
  arr ? arr.push(item) : acc.push([item]);
  return acc
, []);

// test
console.log(newList);

[ORIGINAL] 我不是 100% 确定我理解您的要求,但是,鉴于您的 list 输入数组,您可以获得 newList 输出之一:

const list = [
   id: 1, groupName: null ,
   id: 2, groupName: 'group_1' ,
   id: 3, groupName: 'group_1' ,
   id: 4, groupName: 'group_2' ,
   id: 5, groupName: 'group_2' ,
   id: 6, groupName: null ,
];

const newList = list.reduce((acc, item) => 
  if (!item.groupName) 
    acc.push(item);
   else 
    const arr = acc.find(_item => Array.isArray(_item) && _item[0].groupName === item.groupName);
    arr ? arr.push(item) : acc.push([item]);
  
  
  return acc
, []);

// test
console.log(newList);

简而言之:

    你检查当前项目是否有一个虚假的groupName,如果有,你把它推到输出数组中 否则你检查是否已经有一个子数组用于项目groupName,如果你找到它,你将项目推入现有的子数组,否则你将一个新的子数组推入输出数组,其中包含项目

【讨论】:

非常感谢,这正是我正在寻找的。您的 [ORIGINAL] 版本就是答案。它看起来很重,但这就是解决方案,你真的帮了我。再次感谢您。

以上是关于查找重复项并将其替换为具有相同索引位置的新数组的主要内容,如果未能解决你的问题,请参考以下文章

查找和替换数组中的重复项

Javascript - 计算对象数组中的重复项并将计数存储为新对象

SQL:有没有办法找到重复项并将它们标记为带有大小写的新列

Javascript从多个数组中查找所有重复项

查找特定列并用 gawk 用特定值替换以下列

MongoDb:查找具有重复项的精确数组匹配