资讯专栏INFORMATION COLUMN

JS数组和数据结构的理解

mdluo / 1576人阅读

摘要:创建数组的方法有两种也可以创建指定长度的数组,默认值都是输出数组多少个元素有两种方法向数组里添加元素删除和增加元素在最前和最后位置输出数组元素的个数,在数组后面添加元素输出数组元素的个数,在数组前面添加元素输出删除掉的元素,删除最后面

创建数组的方法有两种;

var  arr1 = new Array();        //也可以创建指定长度的数组,默认值都是undefined;
        arr1[0] = "this is first ele";
        arr1[1] = 1;
        
var arr2 = ["this is first ele",12];

arr1.length   //输出数组多少个元素

有两种方法向数组里添加元素

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

//删除和增加元素在最前和最后位置
arr.push(7)          //->7输出数组元素的个数,在数组后面添加元素
arr.unshift(0)        //->8输出数组元素的个数,在数组前面添加元素

arr.pop()                 //->7  输出删除掉的元素,删除最后面的元素
arr.shift()                 //->0 输出删除掉的元素,删除最前面的元素

//增加或者删除指定位置的元素

arr.splice(arg1,arg2,arg3,...)        //arg1开始的位置(不包含),arg2要删除的个数,是0的话不删除,
//arg3及后面是要替换的元素

arr.splice(1,2,"first","second");         //->[2,3]输出删除的元素,同时替换元素

数组一些常用的方法

var  number = [1,2,3,4,5,6];
var str = ["a","b","c","d","e"];

//连接两个数组,返回新的数组  ->concat();
number.concat(str)            // [1, 2, 3, 4, 5, 6, "a", "b", "c", "d", "e"]

//和字符串类似的方法 ->slice(start,end),indexOf(),lastIndexOf()都是返回新的数组;

number.slice(1,3);                    //[2,3]如果参数是负数,则和长度加转为正数,但两个参数不会按照
//大小调换位置
number.indexOf(3);                //2
number.lastIndexOf(3);             //2

//数组转成字符串,toString(),join();注意是把整个数组转为一个新字符串,同时忽略所有的引号,
//null也会忽略,

str.toString() ===str.join();  //true "a,b,c,d,e"
join()        //参数不是空的话,就把参数取代数字的分隔符" , ";

//可以通过字符串方法split(",")重新生成数组;
var s = str.toString();
s.split(",") == str;    //true

ES5新的方法
1,Array.forEach(callback,[this.obj]),对数组的每个元素都执行函数

在CHROME中输出如上,函数默认有三个参数
1,数组元素
2,元素索引
3,整个数组

var names = ["Biden","Cheney","Gore"];
var presdent = {
    names : ["obama","bush","cliton"],
    read : function(name){if(this.names[0] == "obama"){console.log(name);}},
    job : function(name){alert(name);}
}

presdent.names.forEach(presdent.read);        //undefined;
presdent.names.forEach(presdent.read,presdent);        //obama,bush,cliton

forEach(callback,[object])的第二个参数可以指定要执行的上下文,比如this的指向问题,还有个小问题,如果数组中已经删除的元素是不会在执行函数的,虽然在数组中显示undefined(注意这个值和
直接赋值的undefined是不一样的,类似于 “” 和undefined 的区别)

2,Array.every(callback,[this.obj])Array.some(callback,[this.obj])
返回 true / false;

var number = [2,4,5,6];
var newnum = 3;
function a(arg){
    if(arg>newnum){
        return true;
    }
}
function b1(arg){
    if(number.some(a)){
        console.log("All BIGGER");
    }else{
        console.log("there" at least one small")
    }
}
//All BIGGER
function b2(arg){
    if(number.ervey(a)){
        console.log("All BIGGER");
    }else{
        console.log("there" at least one small")
    }
}
//there" at least one small

从例子中我们可以知道,some方法如果有一个真就返回true,every方法全部真,才返回true;

3,Array.map(callback,[this.obj])Array.filter(callback,[this.obj]);
返回新的数组

var number = [1,3,5,7,8];

function a(arg){
    if(arg>4){
        return "this number is >4: "+ arg;
    }{
        return "this number is<4: "+arg ;
    }
}
number.map(a);    //返回执行后的结果数组,如果函数没有返回值则数组都是undefined;
//["this number is<4: 1", "this number is<4: 3", "this number is >4: 5", 
//"this number is >4: 7", "this number is >4: 8"];

number.filter(a) //返回执行函数后为true的原数组元素,如果函数返回值不是true/false则返回全部
//注意函数的返回值只要松散相等即可如: 0 == false;
// [1, 3, 5, 7, 8]

4,Array.reduce(callback[, initialValue])Array.reduceRight(callback[, initialValue])
返回callback的返回值;

//callback(pre,cur,index,array)有四个参数,其中index 和array和之前的一样,pre和cur代表
//前一个元素和当前的元素(pre后面一个元素);
//如果 initialValue没有省略,则pre =  initialValue,cur为数组第一个元素;
// initialValue省略的话,pre默认为数组第一个元素,cur为第二个
var arr  = [1,3,5,7,9];
function sum(pre,cur,index,array){var add = pre + cur;return add};
arr.reduce(sum,11)
//结果如下
initialValue = pre = 11;  cur = arr[0];
//第一次
add1= pre + arr[0]; cur = arr[1];
//第二次
add2 = add1 +arr[1]
//第 三次
add3 = add2 + arr[2];
//第四次
add4 = add3 + arr[3];
//最后一次
add5 = add4 + arr[4];
//36
arr.reduce(sum)    //25
add.reduceRight(sum)    //25
//和rudece一样区别是index从最后往前;

JS的数据结构

1. 栈 -—后进先出的有序集合;

function Stack(){
    var items = [];
    this.push = function(ele){ items.push(ele);};
    this.pop = function(ele){ return items.pop(ele);};
    this.isEmpty = function(){ return items.length == 0;};
    this.size = function(){return items.length;};
    this.clear = function(){itmes = [];};
    this.show = function(){console.log( items.toString())};
}
//转化进制
function to2(number){
    var tem = new Stack();
    var rem;
    var distNumber = "";
    while(number > 0){
        rem = number%2;
        tem.push(rem);
        number = Math.floor(number/2);
    }
    while(!tem.isEmpty()){
        distNumber += tem.pop().toString();
    }
    return distNumber;
}

2,队列 ——先进先出的有序集合(区分堆栈)

function Queue(){
    var items = [];
    this.front = function(ele){ items.unshift(ele);};
    this.first = function(){return items[0];};
    this.dequeue = function(ele){ return items.shift();}
    this.enqueue = function(ele){ return items.push();}
    this.isEmpty = function(){ return items.length == 0;};
    this.size = function(){return items.length;};
    this.clear = function(){itmes = [];};
    this.show = function(){console.log( items.toString())};
}
//优先队列

3,链表——有序元素组合,但不是连续存放,每节点包含自身和下一个节点的指针

function LinkedList(){
    var Node = function (ele){
        this.element = ele;
        this.next = null;
    };
    var head = null;        //始终是第一个元素节点;
    var length =0;
    this.append = function(ele){
        var node = new Node(ele);
        var current;
        if(head ===null){
            head = node;        //如果没有元素,就直接放在对象里,且属性的next永远是null;
        }else{
            current = head;   //如果不是空的对象,就循环对象的元素,直最后的元素是next 是null;
            while(current.next){
                current = current.next;
                }
              current.next = node;
            }
             length++;
     };
     //这种方法只能从头开始一个一个添加;
    this.insert = function(position,ele){
        if(position>= 0&& position <= length{
            var node = new Node(),
            current =head,
            previous ,
            index = 0;
            if(position ===0){
                previous = current;
                head = node;
            }else{
                while(index++ < positon){
                    previous = current;
                    current = current.next;
                }
                length++;
                return true;
            }else{
                return false;
            }
      };
    this.removeAt = function(position){ 
        if(position > -1 && position < length){
            var current = head,
            previous,
            index = 0;
            if(position == 0){
                head = current.next;
            }else{
                while(index++

4,集合——无序且唯一的项组成的(数学概念的有限集合不重复)值-值存储,区分对象

function Set(){
    var items = {};
    this.has = function(value){
        return items.hasOwnProperty(value);
    };
    this.add =function(value){
        if(!this.has(value)){
            items[value] = value;
            return true;
        }
        return false;
    };
    this.remove = function(){
        if(items.has(value)){
            delete items[value];
            return true;
        }
        return false;
    };
    this.clear = function(){
        items = {};
    };
    this.size = function(){
        return Object.keys(items).length;
    };
    this.values = function (){
        return Object.keys(items);
    };
    this.union = function(otherset){        //合并两个集合,返回新的集合,合集;
        var unionset = new Set();
        var values = this.values();
        for(var i=0;iotherset.size()){
            return false;
        }else{
            var values = this.values();
             for(var i =0;i

5,字典——不重复的存储,键-值保存;

function Dictionary(){
    var items = {};
    this.has = function(key){
        return key in items;
    };
     this.set = function(key,value){
            items[key] = value;
     };
     this.remove = function(key){
         if(this.has(key)){
             delete items[key];
             return true;
         }
         return false;
     };
     this.get = function(key){
         return this.has(key)?items[key]:undefined;
     };
     this.values = function(){
         var values  = [];
         for(var k in items){
             if(this.has(k)){
                 values.push(itmes[k]);
             }
         };
         return values;
     };
     this.getItems = function(){
         return items;
     };
      this.clear = function(){
        items = {};
    };
    this.size = function(){
        return Object.keys(items).length;
    };
    this.values = function (){
        return Object.keys(items);
    };
}

6,散列表——通过函数计算出键的位置,也就是说保存的键值不是我们提供的原始键;

function HashTable(){
    var table = [];
    var loseHashCode = function(key){        //散列函数
        var hash = 0;
        for(var i = 0;i

7,树——非顺寻数据结构

function BinarySearchTree(){
    var Node = function(key){
        this.key = key;
        this.left = null;
        this.right = null;
    };
    var root =null;
    var insertNode = function(node,newNode){
        if(newNode.key < node.key){
            if(node.left === null){
                node.left = newNode;
            }else{
                insertNode(node.left,newNode);
            }
        }else{
            if(node.right ===null){
                node.right = newNode;
            }else{
                insertNode(node.right,newNode);
            }
        }
    };
    this.insert = function(key){
        var newNode  = new Node(key);
        if(root ===null){
            root = newNode;
        }else{
            insertNode(root,newNode)
        }
    };
    var inOrderTraverseNode =function(node,callback){        //中序遍历
        if(node !== null){
            inOrderTraverseNode (node.left,callback);
            callback(node.key);
            inOrderTraverseNode(node.right,callback);
        }
    };
    this.inOrderTraverse = function(callback){
        inOrderTraverseNode (root,callback)
    };
    var printNode = function(value){        //回掉函数
        console.log(value);
    };
    this.preOrderTraverse = function(callback){
        preOrderTraverseNode(root,callback);
    };
    var preOrderTraverseNode = function(node,callback){    //先序遍历
        if(node !== null){
            callback(node.key);
            preOrderTraverseNode(node.left,callback);
            preOrderTraverseNode(node.right,callbck)
        };
    };
      this.postOrderTraverse = function(callback){
        postOrderTraverseNode(root,callback);
    };
    var postOrderTraverseNode = function(node,callback){    //后序遍历
        if(node !== null){
            preOrderTraverseNode(node.left,callback);
            preOrderTraverseNode(node.right,callbck);
               callback(node.key);
        };
    };
    this.min = function(){
        return minNode(root)
    };
    var minNode = function(node){
        if(node){
            while(node && node.left !=null){
                node = node.left;
            }
            return node.key;
        }
        return null;
    };
     this.max= function(){
        return maxNode(root)
    };
    var maxNode = function(node){
        if(node){
            while(node && node.right !=null){
                node = node.right;
            }
            return node.key;
        }
        return null;
    };
    this.search = function(key){
        return searchNode(root,key);
    };
    var searchNode = function(node,key){
        if(node === null){return false;}
        if(keynode.key){return searchNode(node.right,key)}
        else{return true;}
    };
    this.remove = function(key){
        root = removeNode(root,node);
    };
    var removeNode = function(node,key){
        if(node ===null){ return null; };
        if(key < node.key){ 
            node.left = removeNode(node.left,key);
            return node;
        }else if(key>node.key){
            node.right = removeNode(node.right,key)
        }else{
            if(node.left ===null && node.right ===null){
                node =null;
                return node;
            }
            if(node.left ===null){
                node = node.right;
                return node;
            }else if(node.right ===null){
                node = node.left;
                return node;
            };
            var aux = findMinNode(node.right);
            node.key = aux.key;
            node.right = removeNode(node.right,aux.key);
            return node;
        }
    }
    
}

8,图——G = (V ,E)由边和顶点组成

function Graph(){
    var  vertices = [];
    var adjList = new Dictonary();
    this.addVertex = function(v){
        vertices.push(v);
        adjList.set(v,[]);
    };
    this.addEdge = function(v,w){
        adjList.get(v).push(w);
        adjList.get(w).push(v);
    };
    this.toString = function(){
        var s = "";
        for(var i=0;i";
            var neighbors = adjList.get(vertices[i]);
            for(var j =0;j

数组排序的方法

function ArrayList(){
    var array = [];
    this.insert = function(item){array.push(item)};
    this.toString = function(){return array.join()};
    var swap = function(index1,index2){        //交换数组位置的方法
        var temp = array[index1];
        array[index1] = array[index2];
        array[index2] = temp;
    };
    this.bubbleSort = function(){        //冒泡排序从小到大
        var length = array.length;
        for(var i =0;iarray[j+1]){
                    swap(j,j+1);
                }
            }
        }
    };
    this.selectionSort = function(){        //选择排序,选择最小值放在前面;
        var length = array.length;
        var indexMin;
        for(var i= 0;i array[j]){
                    indexMin = j;
                }
            }
            if(i ! = indexMin){
                swap(i,indexMin)
            }
        }
    }
    this.insertionSort = function(){        //插入排序;
        var length= array.length;
        var j,temp;
        for(var i = 0;i0 && array[j-1] >temp){
                array[j] ==array[j-1];
                j--;
            }
            array[j] = temp;
        }
    }
    this.mergeSort = function(){
        array = mergeSortRec(array)
    };
    var mergeSortRec = function(array){
        var length = array.length;
        if(length ===1){
            return array;
        }
        var mid = Math.floor(length/2);
        var left = array.slice(0,mid);
        var right = array.slice(mid,length);
        return merge(mergeSortRec(left),mergeSortRec(right))
    };
    var merge = function(left,right){
    var result = [];
    var il = 0,ir = 0;
    while(il 1){
        index = partition(array,left,right);
        if(left           
               
                                           
                       
                 

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/91868.html

相关文章

  • JSON:如果你愿意一层一层剥开我心,你会发现...这里水很深——深入理解JSON

    摘要:说句玩笑话,如果是基于的,可能就叫了,形式可能就是这样的了,如果这样,那么可能现在是和比较密切了。此外,还有一个函数,我们较少看到,但是它会影响。 我们先来看一个JS中常见的JS对象序列化成JSON字符串的问题,请问,以下JS对象通过JSON.stringify后的字符串是怎样的?先不要急着复制粘贴到控制台,先自己打开一个代码编辑器或者纸,写写看,写完再去仔细对比你的控制台输出,如果有...

    Baaaan 评论0 收藏0
  • JS程序

    摘要:设计模式是以面向对象编程为基础的,的面向对象编程和传统的的面向对象编程有些差别,这让我一开始接触的时候感到十分痛苦,但是这只能靠自己慢慢积累慢慢思考。想继续了解设计模式必须要先搞懂面向对象编程,否则只会让你自己更痛苦。 JavaScript 中的构造函数 学习总结。知识只有分享才有存在的意义。 是时候替换你的 for 循环大法了~ 《小分享》JavaScript中数组的那些迭代方法~ ...

    melody_lql 评论0 收藏0
  • JavaScript知识点总结

    摘要:参与任何数值计算的结构都是,而且。。面向人类的理性事物,而不是机器信号。达到无刷新效果。的工作原理总是指向一个对象,具体是运行时基于函数的执行环境动态绑定的,而非函数被声明时的环境。原型对象上有一个属性,该属性指向的就是构造函数。 1.JS面向对象的理解 面向对象的三大特点:继承、封装、多态 1、JS中通过prototype实现原型继承 2、JS对象可以通过对象冒充,实现多重继承, 3...

    sean 评论0 收藏0
  • 对类型化数组(Typed Array)与ArrayBuffer理解

    摘要:类型化数组也是中新引入的。用一句话解释类型化数组就是它是操作二进制数据的接口。类型化数组类型化数组的应用二进制数据的接口主要应用于文件,在中涉及文件处理的几乎都可以应用,主要是,,。 类型化数组(Typed Array)也是HTML5中新引入的API。用一句话解释类型化数组就是:它是JS操作二进制数据的接口。 众所周知,直接操作二进制数据可以使程序更为高效, 尽管JS对常规数组做了很多...

    Worktile 评论0 收藏0
  • 深入探究immutable.js实现机制(一)

    摘要:本文会集合多方资料以及我自己的一些理解,深入一些探究实现机制。位分区实际上是数字分区的一个子集,所有以的整数次幂,,,,为基数的数字分区前缀树,都可以转为位分区。其实举个例子最好理解比如数字的二进制形式是,这是一个位的二进制数。 Immutable.js 采用了持久化数据结构和结构共享,保证每一个对象都是不可变的,任何添加、修改、删除等操作都会生成一个新的对象,且通过结构共享等方式大幅...

    zhangfaliang 评论0 收藏0

发表评论

0条评论

mdluo

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<