从数组数组中获取唯一值[重复]

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

由于许多解决方案使用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);

【讨论】:

如果所有 Array 方法都存在于 Iterators 上,那就太好了……

以上是关于从数组数组中获取唯一值[重复]的主要内容,如果未能解决你的问题,请参考以下文章

获取嵌套数组/对象的数组中的所有唯一值(删除重复项)

如何获取数组中的唯一值[重复]

Vuejs - 如何使用 v-for 获取数组中的所有唯一值(删除重复项)

ES6方式 - 按键从嵌套数组中获取唯一值

从jquery中的数组中获取唯一元素和元素的数量[重复]

从 JS 数组中删除重复值 [重复]