【问题标题】: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 是的,我认为你是绝对正确的。但它应该在一个循环列表中......并且位置很重要......也许我需要创建一个不同的结构但在一个范围内......

标签: javascript arrays duplicates type-conversion reduce


【解决方案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);

简而言之:

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

【讨论】:

  • 非常感谢,这正是我正在寻找的。您的 [ORIGINAL] 版本就是答案。它看起来很重,但这就是解决方案,你真的帮了我。再次感谢您。
猜你喜欢
  • 2020-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-21
相关资源
最近更新 更多