javascript计算数组重复元素个数,并计算个数

JavaScript023

javascript计算数组重复元素个数,并计算个数,第1张

楼上的回答,如果只针对题主的需求,应该可以解决问题了。

但是,如果考虑的更全面些,我们应该考虑到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