用js實現PHP數組函數庫的部分js代碼函數
最後更新:2017-02-28
來源:互聯網
上載者: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;
}