我有以下数组
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();
如果我有两个索引,这行得通,但是对于多个索引呢?
答案 0 :(得分:3)
您可以使用.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)
答案 1 :(得分:0)
您可以利用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);