[关闭]
@zChange 2017-09-14T00:07:51.000000Z 字数 2563 阅读 147

JavaScript之数组

js Array

数组去重

   var arr = [3, 1, 2, 2, 3, 4, 4, 5, 4, 5, 6, 8, 6, 7,];

通过indexOf判断

  1. Array.prototype.unique = function(){
  2. var arr = [];
  3. for(let i = 0; i < this.length;i++){
  4. if(arr.indexOf(this[i])== -1){
  5. arr.push(this[i]);
  6. }
  7. }
  8. return arr;
  9. }
  10. log(arr.unique());

es5 filter indexOf判断
判断index和arr.indexOf的位置不一致的就是重复的。一致的就是我需要的。

  1. Array.prototype.unique = function () {
  2. return this.filter((item, index) => {
  3. log('__值:' + item + '__所在的位置:' + index + '__arr.indexOf的位置:' + this.indexOf(item))
  4. return this.indexOf(item) === index;
  5. })
  6. }
  7. log(arr.unique());
  1. Array.prototype.unique = function() {
  2. var arr = [];
  3. this.forEach((item)=>{
  4. if(arr.indexOf(item) === -1){
  5. arr.push(item);
  6. }
  7. })
  8. return arr;
  9. }
  10. log(arr.unique());

通过key值去判断

使用key值来去重

  1. Array.prototype.unique = function() {
  2. var arr = [];
  3. var len = this.length;
  4. var key = {};
  5. for(let i =0; i<len;i++){
  6. if(!key[this[i]]){
  7. key[this[i]] = 1;
  8. arr.push(this[i]);
  9. }
  10. }
  11. return arr;
  12. }
  13. log(arr.unique());

使用key值来去重,使用es6
通过new Map,set值,判断存在值就不添加;
可用map.has,或get(用get,set方法必须穿值map.set(this[i],1))

  1. Array.prototype.unique = function () {
  2. var map = new Map();
  3. var arr = [];
  4. var len = this.length;
  5. for (let i = 0; i < len; i++) {
  6. if(!map.has(this[i])){
  7. map.set(this[i]);
  8. arr.push(this[i])
  9. }
  10. }
  11. log(map.keys())
  12. return arr;
  13. }
  14. log(arr.unique());

排序对比前后值

先排序,然后比较前一个值和后一个值是否相同

  1. Array.prototype.unique = function () {
  2. var sort = this.sort();
  3. return sort.filter((item,i,context)=>{
  4. console.log(item,context[i+1],context)
  5. return item !== context[i+1];
  6. })
  7. }
  8. log(arr.unique());

排序后通过reduce对比前后值,reduce会省略最后一个,所以最后push最后一个值

  1. Array.prototype.unique = function () {
  2. var sort = this.sort();
  3. var arr = [];
  4. console.log(sort)
  5. sort.reduce((iA,iB)=>{
  6. console.log(iA,iB);
  7. if(iA !== iB){
  8. arr.push(iA)
  9. }
  10. return iB
  11. })
  12. arr.push(this[this.length-1])
  13. return arr;
  14. }
  15. log(arr.unique());

排序后比较相邻的值

  1. Array.prototype.unique = function () {
  2. var arr = [];
  3. this.sort().forEach((item, index) => {
  4. if (item !== this[index + 1]) {
  5. arr.push(item);
  6. }
  7. })
  8. return arr;
  9. }
  10. log(arr.unique());

先排序,将this的最后一个元素复制给arr,然后对比原数组的i和arr的最后一个对比是否相同

  1. Array.prototype.unique = function () {
  2. this.sort();
  3. var arr = [this[0]];
  4. for(let i =0; i<this.length;i++){
  5. console.log(this[i],arr[arr.length - 1]);
  6. if(this[i] !== arr[arr.length - 1]){
  7. arr.push(this[i])
  8. }
  9. }
  10. return arr;
  11. }
  12. log(arr.unique());

es6

通过includes判断是否存在

  1. Array.prototype.unique = function() {
  2. var arr = [];
  3. this.forEach((item)=>{
  4. if(!arr.includes(item)){
  5. arr.push(item);
  6. }
  7. })
  8. return arr;
  9. }
  10. log(arr.unique());

new Set Array.from [...]

  1. Array.prototype.unique = function() {
  2. return [...(new Set(this))]
  3. return Array.from(new Set(this));
  4. }
  5. log(arr.unique());

浅拷贝数组

  1. var arr = [1,2,3,4];
  2. //concat
  3. var Newarr1 = arr.concat();
  4. console.log(arr === Newarr1)
  5. //slice
  6. var Newarr2 = arr.slice(0);
  7. console.log(arr == Newarr2)
  8. //apply
  9. var Newarr3 = [];
  10. [].push.apply(Newarr3,arr);
  11. console.log(arr == Newarr3)
  12. //join+split !!!数据类型会变成字符串
  13. var Newarr4 = arr.join().split(',');
  14. console.log(arr == Newarr4)
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注