用js实现PHP数组函数库的部分js代码函数

80酷酷网    80kuku.com

   /**
     * 比较两个变量是否相同
     * param {Object} fobj
     * param {Object} sobj
     * return (Boolean)
     */
    var compare = function(fobj, sobj) {
        var ftype = typeof(fobj);
        var stype = typeof(sobj);
        if (ftype == stype) {
            if (ftype == "object") {
                if (fobj.constructor == Array && sobj.constructor == Array) {
                    return compareArray(fobj, sobj)
                } else if (fobj.constructor != Array && sobj.constructor != Array) {
                    return compareObject(fobj, sobj);
                }
                return false;
            }
            return fobj == sobj;
        }
        return false;
    }
    /**
     * 比较两个对象是否相同
     * param {Object} fobj
     * param {Object} sobj
     * return (Boolean)
     */
    var compareObject = function(fobj, sobj) {
        for (var ele in fobj) {
            if (sobj[ele] == undefined) {
                return false;
            }
            if (!compare(fobj[ele], sobj[ele])) {
                return false;
            }
        }
        for (var ele in sobj) {
            if (fobj[ele] == undefined) {
                return false;
            }
            if (!compare(fobj[ele], sobj[ele])) {
                return false;
            }
        }
        return true;
    }
    /**
     * 对比两个数组是否相同
     * param {Object} farr
     * param {Object} sarr
     * return (Boolean)
     */
    var compareArray = function(farr, sarr) {
        if (farr.length != sarr.length) {
            return false;
        }
        for (var i = 0; i < farr.length; i++) {
            if (!compare(farr[i], sarr[i])) {
                return false;
            }
        }
        return true;
    }
   
    /**
     * 计算对象大小
     * param {Object} obj
     * author shenkong(shenkongphp.net)
     */
    var count = function(obj) {
        var length = 0;
        if (typeof obj == 'object') {
            for (k in obj) {
                length++;
            }
        }
        return length;
    }
   
    /**
     * 检查数组中是否存在某个值
     * 在 haystack 中搜索 needle ,如果找到则返回 TRUE,否则返回 FALSE。
     * param {Object} needle
     * param {Object} haystack
     * author shenkong(shenkongphp.net)
     */
    var in_obj = function(needle, haystack) {
        for (key in haystack) {
            if (compare(needle, haystack[key])) {
                return true;
            }
        }
        return false;
    }
   
    /**
     * 检查给定的键名或索引是否存在于数组中
     * param {Object} key
     * param {Object} search
     * author shenkong(shenkongphp.net)
     */
    var obj_key_exists = function(key, search) {
        if (typeof key != 'number' && typeof key != 'string') {
            return false;
        }
        for (k in search) {
            if (k == key) {
                return true;
            }
        }
        return false;
    }
   
    /**
     * 返回 input 中所有的值并给其建立数字索引
     * param {Object} input
     * author shenkong(shenkongphp.net)
     */
    var obj_values = function(input) {
        var o = [];
        for (key in input) {
            o.push(input[key]);
        }
        return o;
    }
   
    /**
     * 返回数组中所有的键名
     * 返回 input 数组中的数字或者字符串的键名。
     * 如果指定了可选参数 search_value ,则只返回该值的键名。否则 input 数组中的所有键名都会被返回。
     * param {Object} input
     * param {Object} search_value
     * author shenkong(shenkongphp.net)
     */
    var obj_keys = function(input, search_value) {
        if (typeof input != 'object') {
            return false;
        }
        var o = [];
        if (search_value == undefined) {
            for (key in input) {
                o.push(key);
            }
        } else {
            for (key in input) {
                if (compare(input[key], search_value)) {
                    o.push(key);
                }
            }
        }
        return o;
    }
   
    /**
     * 创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值。
     * 如果两个数组的单元数不同或者数组为空时返回 FALSE。
     * 如果keys数组值有非字符串或数值的返回 FALSE。
     * param {Object} keys
     * param {Object} values
     * author shenkong(shenkongphp.net)
     */
    var obj_combine = function(keys, values) {
        if (keys.length != values.length) {
            return false;
        }
        if (keys.length == 0) {
            return false;
        }
        if (typeof keys != 'object' || typeof values != 'object') {
            return false;
        }
        var o = {};
        for (var i = 0; i < keys.length; i++) {
            if (typeof keys[i] != 'number' && typeof keys[i] != 'string') {
                return false;
            }
            o[keys[i]] = values[i];
        }
        return o;
    }
   
    /**
     * 在数组中搜索给定的值,如果成功则返回相应的键名
     * 在 haystack 中搜索 needle 参数并在找到的情况下返回键名,否则返回 FALSE。
     * 如果 needle 在 haystack 中出现不止一次,则返回第一个匹配的键。
     * 要返回所有匹配值的键,应该用 obj_keys() 加上可选参数 search_value 来代替。
     * param {Object} needle
     * param {Object} haystack
     * author shenkong(shenkongphp.net)
     */
    var obj_search = function(needle, haystack) {
        if (typeof haystack != 'object') {
            return false;
        }
        for (key in haystack) {
            if (compare(haystack[key], needle)) {
                return key;
            }
        }
        return false;
    }
   
    /**
     * 统计数组中所有的值出现的次数
     * 返回一个对象,该对象用 input 数组中的值作为键名,该值在 input 数组中出现的次数作为值。
     * param {Object} input
     * author shenkong(shenkongphp.net)
     */
    var obj_count_values = function(input) {
        var o = {};
        for (key in input) {
            if (o[input[key]] == undefined) {
                o[input[key]] = 1;
            } else {
                o[input[key]]++;
            }
        }
        return o;
    }
   
    /**
     * 交换对象中的键和值
     * 返回一个反转后的 object,例如 trans 中的键名变成了值,而 trans 中的值成了键名。
     * 如果同一个值出现了多次,则最后一个键名将作为它的值,所有其它的都丢失了。
     * param {Object} trans
     * author shenkong(shenkongphp.net)
     */
    var obj_flip = function(trans) {
        var o = {};
        for (key in trans) {
            o[trans[key]] = key;
        }
        return o;
    }
   
    /**
     * 返回对象的最后一个单元
     * param {Object} obj
     * author shenkong(shenkongphp.net)
     */
    var end = function(obj) {
        for (key in obj) {
        }
        return obj[key];
    }
   
    /**
     * 将回调函数作用到给定数组的单元上
     * 返回一个对象,该对象包含了 arr1 中的所有单元经过 callback 作用过之后的单元。
     * callback 接受的参数数目应该和传递给 obj_map() 函数的数组数目一致。
     * param {Object} callback
     * author shenkong(shenkongphp.net)
     */
    var obj_map = function(callback, arr1) {
        var o = [];
        
        if (callback == null) {
            callback = function() {
                var a = [];
                for (var i = 0; i < arguments.length; i++) {
                    a.push(arguments[i]);
                }
                return a;
            }
        }
        
        for (var i = 1; i < arguments.length; i++) {
            arguments[i] = obj_values(arguments[i]);
        }
        var length = 0;
        for (var i = 1; i < arguments.length; i++) {
            if (arguments[i].length > length) {
                length = arguments[i].length;
            }
        }
        for (var i = 0; i < length; i++) {
            var cmd = [];
            
            for (var j = 1; j < arguments.length; j++) {
                cmd.push('arguments[' + j + '][' + i + ']');
            }
            cmd = 'o[' + i + '] = callback(' + cmd.join(',') + ')';
            eval(cmd);
        }
        return o;
    }

分享到
  • 微信分享
  • 新浪微博
  • QQ好友
  • QQ空间
点击: