楼上的回答,如果只针对题主的需求,应该可以解决问题了。
但是,如果考虑的更全面些,我们应该考虑到JS数组中的数据类型可以是多样的(有可能是Object、Array、String...)
所以我写了一个比较复杂的,效率可能比较低,可以慢慢优化:
(function(){function isObject(o) {
return Object.prototype.toString.call(o) === '[object Object]'
}
function isArray(o) {
return Object.prototype.toString.call(o) === '[object Array]'
}
function duplicate(arr) {
var tmp
if (!arr || arr.length === 0) {
return []
}
for (var i = 0, len = arr.length i < len i++) {
tmp = arr[i]
if (isArray(tmp)) {
for (var j = i + 1 j < len j++) {
if (isArray(arr[j]) && tmp.length === arr[j].length) {
var flag = false
for (var k = 0 k < tmp.length k++) {
if (tmp[k] !== arr[j][k]) {
flag = true
break
}
}
if (!flag) {
arr.splice(j, 1)
len--
j--
}
}
}
} else if (isObject(tmp)) {
for (var j = i + 1 j < len j++) {
if (isObject(arr[j])) {
var tmpKey = [], objKey = [], flag = false
for (var k in tmp) {
tmpKey.push(k)
}
for (var l in arr[j]) {
objKey.push(l)
}
if (tmpKey.length === objKey.length) {
for (var key in tmp) {
if (tmp[key] !== arr[j][key]) {
flag = true
break
}
}
}
if (!flag) {
arr.splice(j, 1)
len--
j--
}
}
}
} else {
for (var j = i + 1 j < len j++) {
if (tmp === arr[j]) {
arr.splice(j, 1)
len--
j--
}
}
}
}
return arr
}
var list = [{"id":1, "name": "AA"}, {"id":1, "name": "AA"}, {"id":1, "name": "AA"}, {"id":2, "name": "BB"}]
var ls = [{"id":1, "name": "AA"}, {"id":1, "name": "AA"}, [12, 23], [12, 23], [12, 23, 34], {"xxx": "yyy", "id": 2}, "aa", "aa", "aabb"]
var list2 = duplicate(list)
var ls2 = duplicate(ls)
console.log(list2)
console.log(ls2)
})()
希望能解决题主的问题...
//将数组转换成字符串,遍历数组,移除一个元素後若还能找到该元素,那么这个元素就是重复的var s = ary.join(",")+","
for(var i=0i<ary.lengthi++) {
if(s.replace(ary[i]+",","").indexOf(ary[i]+",")>-1) {
alert("数组中有重复元素:" + ary[i])
break
}
想在这道题中练习的算法意义,试了一下。用了一些js的高级OO,呵呵=======
<script>
var a=[1,1,1,2,3,3,3,3,4,5,6,6,6,6,6,7,8,8,8,8,9,10,12,12,13,15]
//下句排序如果原数据已排可以去掉
a=a.sort(function(x,y){return x-y})
var d=new Object()
function Record(e,p){
this.element=e
this.pos=p
}
document.writeln("处理前的数组:")
for(var i in a) document.write(a[i]+' ')
var c=1,r=new Record(a[0],0)
for(var i=1i<a.lengthi++){
if(a[i]==r.element) c++
else{
d[c]=(c in d)? d[c].concat(r):[r]
if(c>=3) for(var p=r.posp<ip++) a[p]=0
r=new Record(a[i],i)
c=1
}
}
document.writeln("<br/>处理后的数组:")
for(var i in a) document.write(a[i]+' ')
document.writeln('<br/>')
for(var k in d){
if(k>=3){
document.writeln(k+"个相同-数(位置): ")
for(var i in d[k])
document.writeln(d[k][i].element+'('+d[k][i].pos+') ')
document.writeln('<br/>')
}
}
</script>
=============
处理前的数组: 1 1 1 2 3 3 3 3 4 5 6 6 6 6 6 7 8 8 8 8 9 10 12 12 13 15
处理后的数组: 0 0 0 2 0 0 0 0 4 5 0 0 0 0 0 7 0 0 0 0 9 10 12 12 13 15
3个相同-数(位置): 1(0)
4个相同-数(位置): 3(4) 8(16)
5个相同-数(位置): 6(10)
==========
由于有起始位置,就没必要逐个打印位置。比如
“3个相同-数(位置): 1(0) ”
就知道1从位置0开始重复3次,0, 1, 2