如何使用 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个标识符组成,例如
- JJ2AG -> 这标识该人与哪个人群相关
- 001099 -> 这标识了那个人的 id
所以我最初需要的是在没有 -
的情况下拆分数组的元素,所以结果如下:
[0: JJ2AG, 1: 001099]
然后我应该从 newArry
检查每个项目的 0
是否是唯一的,因此,我应该只有一个数组:
['JJ2AG', 'JJ3AG', 'JJ4AG']
所以最后一个数组只包含上述每个项目的 0
部分一次
我尝试使用 reduce 但无法弄清楚如何拥有这个新数组并且我不能将循环用作 for 和 forEach根据我的要求,到目前为止我在代码片段中做了什么,但我不知道如何根据需要创建一个新数组
['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
发挥作用的地方。
我想了解如何从 .reduce
项数组中 return 不包含重复项。
我的数组比较特殊:
['JJ2AG-001099', 'JJ2AG-001999', 'JJ3AG-001999', 'JJ4AG-001999']
具体来说,数组中的字符串由2个标识符组成,例如
- JJ2AG -> 这标识该人与哪个人群相关
- 001099 -> 这标识了那个人的 id
所以我最初需要的是在没有 -
的情况下拆分数组的元素,所以结果如下:
[0: JJ2AG, 1: 001099]
然后我应该从 newArry
检查每个项目的 0
是否是唯一的,因此,我应该只有一个数组:
['JJ2AG', 'JJ3AG', 'JJ4AG']
所以最后一个数组只包含上述每个项目的 0
部分一次
我尝试使用 reduce 但无法弄清楚如何拥有这个新数组并且我不能将循环用作 for 和 forEach根据我的要求,到目前为止我在代码片段中做了什么,但我不知道如何根据需要创建一个新数组
['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
发挥作用的地方。