从数组数组获取唯一值

时间:2019-07-14 11:15:04

标签: javascript arrays node.js

我有以下数组

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();

如果我有两个索引,这行得通,但是对于多个索引呢?

2 个答案:

答案 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

由于许多解决方案都将flatSet一起使用,因此这是一个使用函数生成器来实际展平数组的解决方案,只要它们不是数组,就产生它们(否则,它递归地展平它们) )。

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);