如何使用 JS reduce to return array without duplicates when using also .split

How to use a JS reduce to return ana rray without duplicates when using also .split

我想了解如何从 .reduce 项数组中 return 不包含重复项。

我的数组比较特殊:

['JJ2AG-001099', 'JJ2AG-001999', 'JJ3AG-001999', 'JJ4AG-001999']

具体来说,数组中的字符串由2个标识符组成,例如

所以我最初需要的是在没有 - 的情况下拆分数组的元素,所以结果如下:

[0: JJ2AG, 1: 001099]

然后我应该从 newArry 检查每个项目的 0 是否是唯一的,因此,我应该只有一个数组:

['JJ2AG', 'JJ3AG', 'JJ4AG']

所以最后一个数组只包含上述每个项目的 0 部分一次

我尝试使用 reduce 但无法弄清楚如何拥有这个新数组并且我不能将循环用作 forforEach根据我的要求,到目前为止我在代码片段中做了什么,但我不知道如何根据需要创建一个新数组

['JJ2AG', 'JJ3AG', 'JJ4AG']

const ids = ['JJ2AG-001099', 'JJ2AG-001999', 'JJ3AG-001999', 'JJ4AG-001999'];

const x = ids.reduce(( acc, item) => {
  console.log('ACC', acc);
  console.log('ITEM', item);
  
  const splited = item.split('-');
  console.log(splited);
  
  const groupId = splited[0];
  console.log(groupId);
  
  return acc.includes(groupId) ? [splited] : [...acc, item];
}, []);

console.log(x)

由于您似乎使用的是现代 JavaScript,您实际上可以为此使用 Set:

const ids = ['JJ2AG-001099', 'JJ2AG-001999', 'JJ3AG-001999', 'JJ4AG-001999'];

const x = [...new Set(ids.map(id => id.split("-")[0]))]

console.log(x)

Set 从数组中获取唯一元素,因此首先,将所有 id 映射到字符串的第一部分 (id.split("-")[0]),将其转换为一个集合,然后使用 spread,将其转换回一个数组。

只需更改:

return acc.includes(groupId) ? [splited] : [...acc, item];

收件人:

return acc.includes(groupId) ? acc : [...acc, groupId];

只要找到重复项,您基本上就是在取消以前的唯一 ID,而是 return 使用 [groupId] 的重复项;您应该 return 保持唯一 ID 不变。您还必须附加到唯一 ID 数组 groupId 而不是 item。请参阅下面的演示:

const ids = ['JJ2AG-001099', 'JJ2AG-001999', 'JJ3AG-001999', 'JJ4AG-001999'];

const x = ids.reduce(( acc, item) => {
  //console.log('ACC', acc);
  //console.log('ITEM', item);
  
  const splited = item.split('-');
  //console.log(splited);
  
  const groupId = splited[0];
  //console.log(groupId);
  
  return acc.includes(groupId) ? acc : [...acc, groupId];
}, []);

console.log(x)

你也可以写成...

const ids = ['JJ2AG-001099', 'JJ2AG-001999', 'JJ3AG-001999', 'JJ4AG-001999'];

const x = ids.reduce(
    ( acc, item) => 
    acc.includes(item.split('-')[0]) ? acc : [...acc, item.split('-')[0]]
    , []
);

console.log(x);

您可以使用 Set 或者您可以使用普通对象并根据需要添加密钥。这是一个使用 reduce.

的单行本
Object.keys(ids.reduce((acc, current)=> { acc[current.split("-")[0]]=true; return acc}, {}))

它的作用是向对象添加键,如果遇到现有键也没关系。最后你需要累加器的键,这就是 Object.keys 发挥作用的地方。