我在这里有一个数组:
var myArr = [1, 1, 2, 5, 5, 7, 8, 9, 9];
现在我想要删除重复的两个外观。所以理想的结果是不:
var myArr = [1, 2, 5, 7, 8 ,9];
但
var myArr = [2, 7, 8];
基本上我知道如何删除重复项,但不是那种特殊方式。这就是为什么任何帮助都会非常感激!
请注意:我的数组中充满了字符串。这里的数字仅用作示例。
答案 0 :(得分:2)
如果涉及删除重复项,使用set data structure并不是一个坏主意。
JavaScript没有本机设置实现,但是对象的键也可以正常工作 - 在这种情况下是帮助,因为这些值可用于跟踪项目在数组中出现的频率:< / p>
function removeDuplicates(arr) {
var counts = arr.reduce(function(counts, item) {
counts[item] = (counts[item]||0)+1;
return counts;
}, {});
return Object.keys(counts).reduce(function(arr, item) {
if(counts[item] === 1) {
arr.push(item);
}
return arr;
}, []);
}
var myArr = [1, 1, 2, 5, 5, 7, 8, 9, 9];
removeDuplicates(myArr);
Check out the example on jsfiddle
或者,您无法使用对reduce()
的调用,而是使用for
和for(item in counts)
循环:
function removeDuplicates(arr) {
var counts = {};
for(var i=0; i<arr.length; i++) {
var item = arr[i];
counts[item] = (counts[item]||0)+1;
}
var arr = [];
for(item in counts) {
if(counts[item] === 1) {
arr.push(item);
}
}
return arr;
}
答案 1 :(得分:1)
以更好的答案编辑:
var myArr = [1, 1, 2, 5, 5, 7, 8, 9, 9];
function removeDuplicates(arr) {
var i, tmp;
for(i=0; i<arr.length; i++) {
tmp = arr.lastIndexOf(arr[i]);
if(tmp === i) {
//Only one of this number
} else {
//More than one
arr.splice(tmp, 1);
arr.splice(i, 1);
}
}
}
答案 2 :(得分:1)
jsfiddle代码:
var myArr = [1, 1, 2, 5, 5, 7, 8, 9, 9];
var newArr = myArr;
var h,i,j;
for(h = 0; h < myArr.length; h++) {
var curItem = myArr[h];
var foundCount = 0;
// search array for item
for(i = 0; i < myArr.length; i++) {
if (myArr[i] == myArr[h])
foundCount++;
}
if(foundCount > 1) {
// remove repeated item from new array
for(j = 0; j < newArr.length; j++) {
if(newArr[j] == curItem) {
newArr.splice(j, 1);
j--;
}
}
}
}
答案 3 :(得分:1)
这是我的版本
var a = [1, 1, 2, 5, 5, 7, 8, 9, 9];
function removeIfduplicate( arr ) {
var discarded = [];
var good = [];
var test;
while( test = arr.pop() ) {
if( arr.indexOf( test ) > -1 ) {
discarded.push( test );
continue;
} else if( discarded.indexOf( test ) == -1 ) {
good.push( test );
}
}
return good.reverse();
}
x = removeIfduplicate( a );
console.log( x ); //[2, 7, 8]
答案 4 :(得分:0)
如果它只是字母数字,重复项区分大小写,并且任何元素都不能超过两个,那么这样的东西可以工作:
var a = [2, 1, "a", 3, 2, "A", "b", 5, 6, 6, "B", "a"],
clean_array = $.map(a.sort(), function (v,i) {
a[i] === a[i+1] && (a[i] = a[i+1] = null);
return a[i];
});
// clean_array = [1,3,5,"A","B","b"]
答案 5 :(得分:0)
在这个例子中,我们将两个数组作为函数参数,由此我们将仅打印两个数组的唯一值,从而删除两个数组中存在的值。
首先,我将两个阵列连接成一个。然后我一次取每个数组值并循环遍历数组本身,搜索它没有发生。如果没有发生(即计数)等于1,那么我们将该元素推入结果数组。然后我们可以返回结果数组。
function diffArray(arr1, arr2) {
var newArr = [];
var myArr=arr1.concat(arr2);
var count=0;
for(i=0;i<myArr.length;i++){
for(j=0;j<myArr.length;j++){
if(myArr[j]==myArr[i]){
count++;
}
}
if(count==1){
newArr.push(myArr[i]);
}
count=0;
}
return newArr;
}
答案 6 :(得分:0)
您可以按以下方式使用Set(在IE 11+中可用)
const sourceArray = [1, 2, 3, 4, 5, 5, 6, 6, 7, 7, 8];
const duplicatesRemoved = new Set();
sourceArray.forEach(element => {
if (duplicatesRemoved.has(element)) {
duplicatesRemoved.delete(element)
} else {
duplicatesRemoved.add(element)
}
})
console.log(Array.from(duplicatesRemoved))
N.B。在较旧的浏览器中不支持箭头功能。为此,请使用常规函数语法。但是,对于较旧的浏览器,Array.from
很容易成为polyfilled。
答案 7 :(得分:0)
此处使用Array.filter()
作为简短版本。技巧是首先找到所有非唯一值,然后使用该数组拒绝原始数组中的所有唯一项。
let myArr = [1, 1, 2, 5, 5, 7, 8, 9, 9];
let duplicateValues = myArr.filter((item, indx, s) => s.indexOf(item) !== indx);
myArr.filter(item => !duplicateValues.includes(item));
// => [2, 7, 8]
// this statement removes all dupicate values
myArr.filter((item, indx, s) => s.indexOf(item) === indx)
// by changing === to !== we do the "opposite", which means that we remove
// all items that are unique
myArr.filter((item, indx, s) => s.indexOf(item) !== indx)
答案 8 :(得分:-1)
编辑:这是jspref http://jsperf.com/deleting-both-values-from-array
这是两次通过中最快的方式,不使用任何花哨的技巧并保持灵活性。你首先旋转并找到每个出现的计数并将其放入和键值对。然后再次旋转它并过滤掉计数大于1的那些。这也具有能够应用除“大于1”之外的其他过滤器的优点;如果你还需要其他东西,那么也要计算出现的数量。
这也适用于字符串而不是数字。
var myArr = [1, 1, 2, 5, 5, 7, 8, 9, 9];
var map = new Object();
for(var i = 0; i < myArr.length; i++)
{
if(map[myArr[i]] === undefined)
{
map[myArr[i]] = 1;
}
else
{
map[myArr[i]]++;
}
}
var result = new Array();
for(var i = 0; i < myArr.length; i++)
{
if(map[myArr[i]] > 1)
{
//do nothing
}
else
{
result.push(myArr[i]);
}
}
alert(result);