如何删除所有重复的数组元素,仅保留单个值?

时间:2019-08-21 12:47:52

标签: javascript arrays

如何只存储单个值的元素?

示例:

> ['a', 'b', 'c', 'd', 'e', 'b', 'a', 'd'] // this
> ['c', 'e'] // to this

有人可以帮我吗?

3 个答案:

答案 0 :(得分:2)

使用reducefilter的O(n)解决方案。

var data = ['a', 'b', 'c', 'd', 'e', 'b', 'a', 'd']

let map = data.reduce((a,c) => (a[c] = (a[c] || 0) + 1,a),{}),
    res = Object.keys(map).filter(e => map[e] == 1);

console.log(res)

首先,我们使用reduce创建元素的映射,计算元素在数组中出现的频率,以作为每个元素键的值。然后,我们使用Object.keys来获取键并应用filter,仅保留那些值正好为1的键。

答案 1 :(得分:1)

您可以将第一个找到的元素索引与最后一个元素进行比较,并根据这些元素过滤数组

const data = ['a', 'b', 'c', 'd', 'e', 'b', 'a', 'd'];
const result = data.filter(element => data.indexOf(element) === data.lastIndexOf(element))
console.log(result)

答案 2 :(得分:0)

简单而算法化的方法:

在第一次迭代中,每个元素的计数都存储为键值对(键是实际的 element ,而 count 是值)。

如果元素已经在对象中,则增加其计数,否则将其存储为1。

在第二次迭代中,我们将所有计数恰好为1 的元素推到新数组中。

var a = ['a', 'b', 'c', 'd', 'e', 'b', 'a', 'd']
var repeating = {};
a.map(_ => {
  if(_ in repeating) {
    repeating[_] += 1;
  } else {
    repeating[_] = 1;
  }
})

let nonRepeating = [];

for(var key in repeating) {
  if(repeating[key] == 1) {
    nonRepeating.push(key);
  }
}

console.log(nonRepeating)