我有一个非常简单的JavaScript数组,可能包含也可能不包含重复项。
var names = ["Mike","Matt","Nancy","Adam","Jenny","Nancy","Carl"];
我需要删除重复项并将唯一值放入新数组。
我可以指出我尝试过的所有代码,但我认为它们没有用,因为它们不起作用。我也接受jQuery解决方案。
类似的问题:
获取数组中的所有非唯一值(即:重复/多次出现)
我有一个非常简单的JavaScript数组,可能包含也可能不包含重复项。
var names = ["Mike","Matt","Nancy","Adam","Jenny","Nancy","Carl"];
我需要删除重复项并将唯一值放入新数组。
我可以指出我尝试过的所有代码,但我认为它们没有用,因为它们不起作用。我也接受jQuery解决方案。
类似的问题:
获取数组中的所有非唯一值(即:重复/多次出现)
当前回答
$(document).ready(function() {
var arr1=["dog","dog","fish","cat","cat","fish","apple","orange"]
var arr2=["cat","fish","mango","apple"]
var uniquevalue=[];
var seconduniquevalue=[];
var finalarray=[];
$.each(arr1,function(key,value){
if($.inArray (value,uniquevalue) === -1)
{
uniquevalue.push(value)
}
});
$.each(arr2,function(key,value){
if($.inArray (value,seconduniquevalue) === -1)
{
seconduniquevalue.push(value)
}
});
$.each(uniquevalue,function(ikey,ivalue){
$.each(seconduniquevalue,function(ukey,uvalue){
if( ivalue == uvalue)
{
finalarray.push(ivalue);
}
});
});
alert(finalarray);
});
其他回答
像这样使用Array.filter()
var actualArr=[苹果',苹果',香蕉',芒果',草莓',香蕉];console.log('实际数组:'+actualArr);var filteredArr=actualArr.filter(函数(项,索引){if(actualArr.indexOf(item)==索引)退货项目;});console.log('FilteredArray:'+filtedArr);
这可以在ES6中缩短到
actualArr.filter((item,index,self) => self.indexOf(item)==index);
下面是Array.filter()的详细解释
另一种不用编写太多代码就可以做到这一点的方法是使用ES5 Object.keys-method:
var arrayWithDuplicates = ['a','b','c','d','a','c'],
deduper = {};
arrayWithDuplicates.forEach(function (item) {
deduper[item] = null;
});
var dedupedArray = Object.keys(deduper); // ["a", "b", "c", "d"]
在函数中提取
function removeDuplicates (arr) {
var deduper = {}
arr.forEach(function (item) {
deduper[item] = null;
});
return Object.keys(deduper);
}
通用功能方法
以下是ES2015的通用和严格功能方法:
//小型、可重复使用的辅助功能常量应用=f=>a=>f(a);常量flip=f=>b=>a=>f(a)(b);常量未修正=f=>(a,b)=>f(a)(b);常量push=x=>xs=>(xs.push(x),xs);常量foldl=f=>acc=>xs=>xs.reduce(uncurry(f),acc);常量some=f=>xs=>xs.some(apply(f));//实际的重复数据消除功能常量uniqueBy=f=>foldl(acc=>x=>一些(f(x))(acc)? 应收账款:推(x)(acc)) ([]);//比较器常量eq=y=>x=>x===y;//字符串相等不区分大小写:D常量seqCI=y=>x=>x.toLowerCase()===y.toLowerCase();//模拟数据常量xs=[1,2,3,1,2,3,4];常量ys=[“a”、“b”、“c”、“a”、“b”、“c”、“D”];console.log(uniqueBy(eq)(xs));console.log(uniqueBy(seqCI)(ys));
我们可以很容易地从unqiueBy中派生出唯一的,或者使用Sets更快地实现:
const unqiue = uniqueBy(eq);
// const unique = xs => Array.from(new Set(xs));
此方法的优点:
使用单独比较器函数的通用解决方案声明性和简洁的实现其他小型通用函数的重用
性能注意事项
uniqueBy不如具有循环的命令式实现快,但由于它的泛型性,它更具表现力。
如果您确定uniqueBy是应用程序中具体性能损失的原因,请用优化的代码替换它。也就是说,首先以功能性、声明性的方式编写代码。之后,如果您遇到性能问题,请尝试在导致问题的位置优化代码。
内存消耗和垃圾收集
uniqueBy利用隐藏在其体内的突变(push(x)(acc))。它重用累加器,而不是在每次迭代后丢弃它。这减少了内存消耗和GC压力。由于这种副作用被包装在函数内部,所以外部的一切都保持纯净。
这里是另一种使用jQuery的方法,
function uniqueArray(array){
if ($.isArray(array)){
var dupes = {}; var len, i;
for (i=0,len=array.length;i<len;i++){
var test = array[i].toString();
if (dupes[test]) { array.splice(i,1); len--; i--; } else { dupes[test] = true; }
}
}
else {
if (window.console) console.log('Not passing an array to uniqueArray, returning whatever you sent it - not filtered!');
return(array);
}
return(array);
}
作者:William Skidmore
到目前为止我遇到的最简单的一个。在es6。
var names = ["Mike","Matt","Nancy","Adam","Jenny","Nancy","Carl", "Mike", "Nancy"]
var noDupe = Array.from(new Set(names))
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set