跟我学几个常用的数组方法

156 阅读1分钟

跟我学几个常用的数组方法

const overWrite = Symbol('overWrite')
class ArrayHandle{
    constructor(){
        this[overWrite]();
    }
    [overWrite](){
        Array.prototype.change = function(callback){
            if(typeof callback != 'function'){return new Error('${callback} is not function')}
            for(let i = 0; i<this.length; i++){
                let isDel = callback.call(this,this[i],i);
                !isDel && this.splice(i,1) && i--
                
            }
            return this;
        }
    }
    isHasPro(obj,pro){
        return obj.hasOwnProperty(pro);
    }
    //判断是否是对象字面量
    isPlainObject(obj){
        let flag = false;
		if(!obj || typeof obj != 'object'){return flag;}
		if(this.isHasPro(obj.constructor.prototype,"isPrototypeOf")){
			flag = true;
		}
		return flag;
    }
    //伪数组转直
    arrayLike(arrLike){
        return Array.from ? Array.from(arrLike) : Array.prototype.slice.call(arrLike);
    }
    //生成自然数
    times(num,isIncludeZero){
        isIncludeZero = isIncludeZero||0;
        let arr = [],i = 0;
        isIncludeZero && (i = -1,isIncludeZero = -1)
        while(num>isIncludeZero){
            num--;
            arr.push(++i);
        }
        return arr;
    }
    //一维到二维
    toTwoArray(arr,num){
        let rows = [];
        num = num||7;
        arr = arr.concat();
        while(arr.length > 0) {
            rows.push(arr.splice(0, num));
        }
        return rows;
    }
    //二维数组转一维
    flat(arr){
        return arr.reduce((a, b)=>{
             return a.concat(b)
        });
    }
    //数组拼接
    arrayConcact(...arrs){
        let target = arrs.shift()
        arrs.forEach(arr=>{
            Array.prototype.push.apply(target,arr)
        })
        return target;
    }
    //获取json数组中某个字段
    getFields(jsonArr,feild) {
        jsonArr = jsonArr || [];
        return jsonArr.map(function(json){
            return json[feild]
        })
    }
    /** 
     * 获取json数组中的对象
     * getJson([{name:'ck',...},{name:'ck2',...}],{name:'ck2'})
     * getJson([{name:'ck',...},{name:'ck2',...}],function(item,i){
     *     return item.name == 'ck';
     * })  
     */
    getJson(jsonArr,rule){
        for(let i=0,len=jsonArr.length; i<len; i++){
            let item = jsonArr[i];
            if(isPlainObject(rule)){
                let key = Object.keys(rule)[0]
                if(item[key] == rule[key]){
                    return item;
                }
            }
            if(typeof rule == 'function'){
               let isTargetObj = rule.call(jsonArr,item,i);
               if(isTargetObj){
                   return item;
               }
            }
        }
    }
    //是否是空数组
    isEmptyArr(arr){
        return JSON.stringify(arr) === '[]';
    }
    /**
     * 根据值删除数组中的元素
     * delValInArray([1,3,4,2,7,3,4,6,2],7)==>[1,3,4,2,3,4,6,2]
     * delValInArray([1,3,4,2,7,3,4,6,2],3,true)==>[1,4,2,4,7,6,2]
     * delValInArray([1,3,4,2,7,3,4,6,2],[3,4])==>[1,2,7,3,4,6,2]
     * delValInArray([1,3,4,2,7,3,4,6,2],[3,4],true)==>[1,2,7,6,2]
     * delValInArray([{name:'ck',...},{name:'ck2',...}],function(item,i){
     *      return item.name == 'ck';
     * })
     */
    delValInArray(arr,val,global=false){
        if(typeof val == 'function'){
            return arr.change((item,i)=>{
                return !val.call(arr,item,i);
            });
        }else{
            val = Array.isArray(val) ? val : [val];
            val.forEach(item=>{
                let index = arr.indexOf(item);
                if(global){
                    while(arr.indexOf(val) > -1){
                        arr.splice(index,1);
                    }
                }else{
                    arr.splice(index,1);
                }
            })
            return arr;
        }
    }
    //数组去重
    uniArr(arr,field){
        for(let i=0; i<arr.length; i++){
            for(let j=i+1; j<arr.length; j++){
                let prev = field ? arr[i][field] : arr[i];
                let next = feild ? arr[j][field] : arr[j];
                prev == next && arr.splice(j,1) && j--
            }
        }
        return arr;
    }
    /**
	 * 简单节点转父子树
	 * 数据格式如下:
	 * var nodes =[
		{ id:1, pId:0, name:"随意勾选 1"},
		{ id:11, pId:1, name:"随意勾选 1-1"},
		{ id:111, pId:11, name:"随意勾选 1-1-1"},
		{ id:112, pId:11, name:"随意勾选 1-1-2"},
		{ id:12, pId:1, name:"随意勾选 1-2"},
		{ id:121, pId:12, name:"随意勾选 1-2-1"},
		{ id:122, pId:12, name:"随意勾选 1-2-2"},
		{ id:2, pId:0, name:"随意勾选 2"},
		{ id:21, pId:2, name:"随意勾选 2-1"},
		{ id:22, pId:2, name:"随意勾选 2-2"},
		{ id:221, pId:22, name:"随意勾选 2-2-1"},
		{ id:222, pId:22, name:"随意勾选 2-2-2"},
		{ id:23, pId:2, name:"随意勾选 2-3"}
	   ];
    */
    parSubTree(nodes){
       var nodePoint = {},node = [];
        // 删除所有 children属性,以防止多次调用
        nodes.forEach(node=>{
            delete node.children;
        });
        nodes.forEach(node=>{
            nodePoint[node.id] = node;
        });
        nodes.forEach(node=>{
            if(node.pId in nodePoint){
                (nodePoint[node.pId].children || (nodePoint[node.pId].children = [])).push(node);
            }else{//不在则是顶级节点
                node.push(node);
            }
        });
        return node;
    }
    /**
     * 父子树转简单节点
     * @param {*} nodes 
     * @param {*} childName 
     * @param {*} id 
     */
    parSubToSimpleTree(nodes,childName,id){
        childName = childName || 'children';
        id = id || 'id';
        let level = 1
        ,simpleNodesFn = function(nodes,pId){
            let simpleNodes = [];
            nodes.forEach(node=>{
                node.pId = pId;
                node.level = level;
                simpleNodes.push(node);
                let childs = node[childName]
                if(childs && childs.length>0){
                    level++
                    simpleNodes = simpleNodes.concat(simpleNodesFn(childs,node[id]));
                    level--;
                }
            })
            return simpleNodes;
        }
        ,simpleNodes = simpleNodesFn(nodes,null);
        simpleNodes.forEach(function(node){
            node[childName] && delete node[childName];
        })
        return simpleNodes;
    }
}