我们假设我有;
var array = [1,2,3,4,4,5,5];
我想要它;
var newArray = [1,2,3];
我想完全删除重复项,而不是将它们保留为唯一值。有没有办法通过reduce方法实现呢?
答案 0 :(得分:8)
您可以将Array#filter
与Array#indexOf
和Array#lastIndexOf
一起使用,并仅返回共享相同索引的值。
var array = [1, 2, 3, 4, 4, 5, 5],
result = array.filter(function (a, _, aa) {
return aa.indexOf(a) === aa.lastIndexOf(a);
});
console.log(result);

答案 1 :(得分:2)
我想它不会有一些非凡的表现,但我喜欢这个想法。
var array = [1,2,3,4,4,5,5],
res = array.reduce(function(s,a) {
if (array.filter(v => v !== a).length == array.length-1) {
s.push(a);
}
return s;
}, []);
console.log(res);

答案 2 :(得分:0)
另一种选择是使用对象来跟踪元素的使用次数。这将破坏数组顺序,但在非常大的数组上应该快得多。
function nukeDuplications(arr) {
const hash = {};
arr.forEach(el => {
const qty = hash[el] || 0;
hash[el] = qty+1;
});
const ret = [];
Object.keys(hash).forEach(key => {
if (hash[key] === 1) {
ret.push(Number(key));
}
})
return ret;
}
var array = [1,2,3,4,4,5,5];
console.log(nukeDuplications(array));
答案 3 :(得分:0)
稍微更有效的解决方案是循环遍历数组1次并计算每个值中出现的次数并使用.reduce()
将它们存储在对象中,然后使用{{1}再次遍历数组仅返回发生过一次的项目。
此方法还将保留数组的顺序,因为它仅使用对象键作为引用 - 它不会迭代它们。
.filter()

答案 4 :(得分:0)
另一种选择是使用对象来跟踪元素的使用次数。这将破坏数组顺序,但在非常大的数组上应该快得多。
// Both versions destroy array order.
// ES6 version
function nukeDuplications(arr) {
"use strict";
const hash = {};
arr.forEach(el => {
const qty = hash[el] || 0;
hash[el] = qty + 1;
});
const ret = [];
Object.keys(hash).forEach(key => {
if (hash[key] === 1) {
ret.push(Number(key));
}
})
return ret;
}
// ES5 version
function nukeDuplicationsEs5(arr) {
"use strict";
var hash = {};
for (var i = 0; i < arr.length; i++) {
var el = arr[i];
var qty = hash[el] || 0;
hash[el] = qty + 1;
};
var ret = [];
for (let key in hash) {
if (hash.hasOwnProperty(key)) {
if (hash[key] === 1) {
ret.push(Number(key));
}
}
}
return ret;
}
var array = [1, 2, 3, 4, 4, 5, 5];
console.log(nukeDuplications(array));
console.log(nukeDuplicationsEs5(array));
答案 5 :(得分:0)
这里有很多过于复杂且运行缓慢的代码。这是我的解决方案:
let numbers = [1,2,3,4,4,4,4,5,5]
let filtered = []
numbers.map((n) => {
if(numbers.indexOf(n) === numbers.lastIndexOf(n)) // If only 1 instance of n
filtered.push(n)
})
console.log(filtered)
答案 6 :(得分:0)
您可以使用此功能:
function isUniqueInArray(array, value) {
let counter = 0;
for (let index = 0; index < array.length; index++) {
if (array[index] === value) {
counter++;
}
}
if (counter === 0) {
return null;
}
return counter === 1 ? true : false;
}
const array = [1,2,3,4,4,5,5];
let uniqueValues = [];
array.forEach(element => {
if(isUniqueInArray(array ,element)){
uniqueValues.push(element);
}
});
console.log(`the unique values is ${uniqueValues}`);
如果有帮助,可以从我的软件包https://www.npmjs.com/package/jotils或直接从https://bit.dev/joshk/jotils/is-unique-in-array位安装isUniqueInArray函数。
答案 7 :(得分:0)
我的答案用于地图和过滤器,如下所示:
x = [1,2,3,4,2,3]
x.map(d => x.filter(i => i == d).length < 2 ? d : null).filter(d => d != null)
// [1, 4]
答案 8 :(得分:0)
Object.values(不用说-不在IE上)。 累加器是一个对象,每个键都是一个值,因此,当重复项覆盖相同的键时,将删除重复项。 但是,此解决方案可能会有错误的值(空值,未定义等)的风险,但对于现实生活中的场景可能有用。
let NukeDeps = (arr) => {
return Object.values(arr.reduce((curr, i) => {
curr[i] = i;
return curr;
}, {}))
}
答案 9 :(得分:0)
我想用我再次阅读后想出的答案来回答我的问题
const array = [1, 2, 3, 4, 4, 5, 5];
const filtered = array.filter(item => {
const { length } = array.filter(currentItem => currentItem === item)
if (length === 1) {
return true;
}
});
console.log(filtered)
答案 10 :(得分:-1)
//Try with this code
var arr = [1,2, 3,3,4,5,5,5,6,6];
arr = arr.filter( function( item, index, inputArray ) {
return inputArray.indexOf(item) == index;
});