用js實現PHP數組函數庫的部分js代碼函數

來源:互聯網
上載者:User
 /**
     * 比較兩個變數是否相同
     * @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(shenkong@php.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(shenkong@php.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(shenkong@php.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(shenkong@php.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(shenkong@php.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(shenkong@php.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(shenkong@php.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(shenkong@php.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(shenkong@php.net)
     */
    var obj_flip = function(trans) {
        var o = {};
        for (key in trans) {
            o[trans[key]] = key;
        }
        return o;
    }
   
    /**
     * 返回對象的最後一個單元
     * @param {Object} obj
     * @author shenkong(shenkong@php.net)
     */
    var end = function(obj) {
        for (key in obj) {
        }
        return obj[key];
    }
   
    /**
     * 將回呼函數作用到給定數組的單元上
     * 返回一個對象,該對象包含了 arr1 中的所有單元經過 callback 作用過之後的單元。
     * callback 接受的參數數目應該和傳遞給 obj_map() 函數的數組數目一致。
     * @param {Object} callback
     * @author shenkong(shenkong@php.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;
    }

相關文章

Cloud Intelligence Leading the Digital Future

Alibaba Cloud ACtivate Online Conference, Nov. 20th & 21st, 2019 (UTC+08)

Register Now >

Starter Package

SSD Cloud server and data transfer for only $2.50 a month

Get Started >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。