如题,对于一个多层嵌套的对象。例如
var o = {
a:1,
b:{b_a:''},
c:{c_a:1,c_b:''}
}
通过处理,希望得到
{
a:1,
c:{c_a:1}
}
尝试过这个方法(stackOverflow):
function removeEmpty(obj) {
Object.keys(obj).forEach(function(key) {
(obj[key] && typeof obj[key] === 'object') && removeEmpty(obj[key]) ||
(obj[key] === undefined || obj[key] === null) && delete obj[key]
});
return obj;
};
没有成功.求一个删除空value''
和空对象{}
的属性方法,蟹蟹。
PHP中文网2017-04-10 17:26:42
试试下面代码,没用函式库,直接作两次递回,第一次去空字串,第二次是去空对象,没细测过大量资料时的效能,但可得出你要的结果。再深层一些可再试试:
function isEmpty(obj) {
return (Object.keys(obj).length === 0 && obj.constructor === Object);
}
function deleteEmptyString(test, recurse) {
for (var i in test) {
if (test[i] === '' ) {
delete test[i];
} else if (recurse && typeof test[i] === 'object') {
deleteEmptyString(test[i], recurse);
}
}
}
function deleteEmptyObject(test, recurse) {
for (var i in test) {
if (isEmpty(test[i]) ) {
delete test[i];
} else if (recurse && typeof test[i] === 'object') {
deleteEmptyObject(test[i], recurse);
}
}
}
var o = {
a:1,
b:{b_a:''},
c:{c_a:1,c_b:''},
//d:{d_a:1,d_b:'', d_c: { x:'', y:1}, d_d:{ z:'' } }
}
deleteEmptyString(o, true);
console.log(o);
deleteEmptyObject(o,true);
console.log(o);
参考自: http://stackoverflow.com/ques...
http://stackoverflow.com/ques...
ringa_lee2017-04-10 17:26:42
有借鉴一楼
//无论是空字符串、空整形、空对象都返回true
function isEmpty(obj){
var _isEmpty = false;
if(typeof obj ==='string'||typeof obj ==='number'){
_isEmpty = !obj;
}else if(isPlainObj(obj)){
var value = "";
for(var i in obj){
value += obj[i];
}
_isEmpty = !value;
}
return _isEmpty;
}
//判断是否是字面量对象
function isPlainObj(obj){
return (obj instanceof Object )&& (obj.constructor === Object);
}
function deleteEmptyObj (key,container){
container = container||window;
if(isEmpty(container[key])){
delete container[key];
}else if(isPlainObj(container[key])){
for(var i in container[key]){
deleteEmptyObj(i,container[key]);
}
}
}
var o = {
a:1,
b:{b_a:''},
c:{c_a:1,c_b:''}
};
//就是调用比较奇怪一点
deleteEmptyObj('o',window);