這兩天在項目中遇到后臺需要傳的數(shù)據(jù)為不能有null,不能有空值,而這個數(shù)據(jù)又是一個龐大的對象,對組集合,所以寫了個方法來解決這個問題。為了兼具所有的種類類型,封裝了方法,代碼如下:
let obj = { a: { a_1: 'qwe', a_2: undefined, a_3: function (a, b) { return a + b; }, a_4: { a_4_1: 'qwe', a_4_2: undefined, a_4_3: function (a, b) { return a + b; }, a_4_4: { a_4_4_1: undefined, a_4_4_2: undefined, a_4_4_3: undefined, a_4_4_4: { a_4_4_4_1: undefined, a_4_4_4_2: undefined, a_4_4_4_3: undefined, a_4_4_4_4: undefined, a_4_4_4_5: undefined, a_4_4_4_6: undefined } } } }, b: [{ a_1: 'qwe', a_2: undefined, a_3: function (a, b) { return a + b; }, a_4: { a_4_1: 'qwe', a_4_2: undefined, a_4_3: function (a, b) { return a + b; }, a_4_4: { a_4_4_1: undefined, a_4_4_2: undefined, a_4_4_3: undefined, a_4_4_4: { a_4_4_4_1: undefined, a_4_4_4_2: undefined, a_4_4_4_3: undefined, a_4_4_4_4: undefined, a_4_4_4_5: undefined, a_4_4_4_6: undefined } } } }], c: [{ a: undefined, b: undefined, c: undefined, d: undefined }, { a: undefined, b: undefined, c: undefined, d: undefined }] };
以下是javaScript部分:
//判斷對象是否沒有屬性,如{}或者[] function isEmptyObj(o) { for (let attr in o) return !1; return !0 } function processArray(arr) { for (let i = arr.length - 1; i >= 0; i--) { if (arr[i] === null || arr[i] === undefined) arr.splice(i, 1); else if (typeof arr[i] == 'object') removeNullItem(arr[i], arr, i); } return arr.length == 0 } function proccessObject(o) { for (let attr in o) { if (o[attr] === null || o[attr] === undefined) delete o[attr]; else if(typeof o[attr]=='object') { removeNullItem(o[attr]); if (isEmptyObj(o[attr])) delete o[attr]; } } } function removeNullItem(o,arr,i) { let s = ({}).toString.call(o); if (s == '[object Array]') { if (processArray(o) === true) {//o也是數(shù)組,并且刪除完子項,從所屬數(shù)組中刪除 if (arr) arr.splice(i, 1); } } else if (s == '[object Object]') { proccessObject(o); if (arr&&isEmptyObj(o)) arr.splice(i, 1); } } removeNullItem(obj) console.log(obj)
如果只處理對象null,undefined項,不移除數(shù)組中undefined,null的項,保持?jǐn)?shù)組長度則去掉removeNullItem,processArray刪除數(shù)項即可,測試數(shù)據(jù)在上面示例中
-收縮JavaScript代碼
function processArray(arr) { for (let i = arr.length - 1; i >= 0; i--) { /*if (arr[i] === null || arr[i] === undefined) arr.splice(i, 1); else */if (typeof arr[i] == 'object') removeNullItem(arr[i], arr, i); } return arr.length == 0 } function removeNullItem(o,arr,i) { let s = ({}).toString.call(o); if (s == '[object Array]') { if (processArray(o) === true) {//o也是數(shù)組,并且刪除完子項,從所屬數(shù)組中刪除 //if (arr) arr.splice(i, 1); } } else if (s == '[object Object]') { proccessObject(o); //if (arr&&isEmptyObj(o)) arr.splice(i, 1); } }
附:javascript 判斷變量 是否為空null,undefined, 空數(shù)組,空對象,空Object,字符串是否為空或全由空白字符組成,數(shù)字是否為0,布爾是否為false。由于Object沒有l(wèi)ength用
Object.keys()適用于數(shù)組(IE8不支持此屬性),對象 返回可枚舉的實例屬性名組成的數(shù)組來判斷是否為空。
利用邏輯判斷中or (||)只要有一項為真則不再計算下一個表達式 來實現(xiàn)不管傳入的參數(shù)是何種類型。只要符合我對空的定義即返回true。
function IsNothing(e) { var isNt = e === 0 || e === false || e === null || e === undefined || Object.keys(e).length === 0 || /^\s*$/gim.test(e.toString()); return isNt; }
總結(jié)
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com