从数组数组中获取唯一值[重复]
Posted
技术标签:
【中文标题】从数组数组中获取唯一值[重复]【英文标题】:Get unique values from array of arrays [duplicate] 【发布时间】:2019-11-23 09:32:52 【问题描述】:我有以下数组
let arr = [
[
"s1@example.com",
"s2@example.com"
],
[
"s1@example.com",
"s3@example.com"
]
]
我想从这个数组中获取唯一值。所以我希望我的结果是这样的
[
[
"s1@example.com",
"s2@example.com",
"s3@example.com"
]
]
我使用了数组唯一函数但无法得到结果
var new_array = arr[0].concat(arr[1]);
var uniques = new_array.unique();
如果我有两个索引,这可行,但是多个索引呢?
【问题讨论】:
这是.unique()
方法 ES...DOESN'T-EXIST 吗?尝试使用.writeCodeForMe()
方法。
【参考方案1】:
您可以使用.flat()
来展平您的数组,然后使用Set
来获取其唯一值。
演示:
let arr = [
[
"s1@example.com",
"s2@example.com"
],
[
"s1@example.com",
"s3@example.com"
]
]
let arr2 = [...new Set(arr.flat(1))];
console.log(arr2)
【讨论】:
【参考方案2】:您可以利用Set
,它会自动处理重复项,您可以在此处找到有关 Set 的更多信息:https://developer.mozilla.org/en-US/docs/Web/javascript/Reference/Global_Objects/Set
由于许多解决方案使用flat
和Set
,这里有一个使用函数生成器实际展平数组的解决方案,只要它们不是数组就产生项目(否则,它会递归展平它们)。
let arr = [
[
"s1@example.com",
"s2@example.com"
],
[
"s1@example.com",
"s3@example.com"
]
];
function* flatten(array)
for (var item of array)
if (Array.isArray(item))
yield* flatten(item)
else yield item;
const set = [...new Set(flatten(arr))];
console.log('set is', set);
如果您不想使用Set
,这里有一个没有Set
的解决方案,方法是创建一个新数组并推送不存在的项目。
let arr = [
[
"s1@example.com",
"s2@example.com"
],
[
"s1@example.com",
"s3@example.com"
]
];
function* flatten(array)
for (var item of array)
if (Array.isArray(item))
yield* flatten(item)
else yield item;
let unique = [];
for (const item of flatten(arr))
if (unique.indexOf(item) === -1) unique.push(item);
console.log(unique);
【讨论】:
如果所有 Array 方法都存在于 Iterators 上,那就太好了……以上是关于从数组数组中获取唯一值[重复]的主要内容,如果未能解决你的问题,请参考以下文章