今天遇到一个需求,需求是要求判断数组中是否有重复元素。每一个元素都是一个10位的快递单号,但是需求并不要求指出哪个元素重复,仅需给出是否含有重复元素的判断。
第一想法,可能是遍历数组,判断元素是否在剩下的数组元素所组成的数组中有索引
上代码,no code, no die
let array = [1,2,3,4,5,2,5];
for ( let i = 0, length = array.length; i < length ; i++;) {
if ( array[i].indexOf(array.slice(i++)) != -1) {
console.log("有重复的")
}
}
那么大家有没有想过,如果这个重复的元素刚好是数组的最后一个元素,或者说是最后两个元素重复,而这个数组又非常大,那么,如上的做法效率就会非常低。下面上我自己学python和java的时候,在字典和map学到的唯一性的做法,仅供参考,如果你有更好的做法,欢迎共享出来。
let array = [1,2,3,4,5,2,5];
let obj = {}
for ( let i = 0, length = array.length; i < length ; i++;) {
obj[array[i]] = i;
}
这里是关键,JavaScript中对象的键是唯一性的,所以,我们将数组的值作为对象的键,而对象的索引,作为对象的值,如果数组中有重复的元素,那么,对象中相同值的对象必定会被覆盖,这样,数组中元素的长度,必定不等于对象的长度,由此,可以得到我们的算法
if ( array.length != Object.keys(obj)) {
console.log("有重复的");
}
怎么样,是不是效率更高了呢,这是必定的。这个思路是从python的字典,以及java中的set和map学来的,如果大家有更好的办法,希望不吝赐教。
我一直在想,能否不循环,就判断数组中是否有相同的值呢?如果能够避免循环,那么对于效率,我相信会是个更高的提升,尤其在大数据的情况下,更加明显.....
如果有更好的算法,我会更新这篇文章。未完待续.....