如何只存储单个值的元素?
示例:
> ['a', 'b', 'c', 'd', 'e', 'b', 'a', 'd'] // this
> ['c', 'e'] // to this
有人可以帮我吗?
答案 0 :(得分:2)
使用reduce
和filter
的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)