开发中,有时候,一个对象嵌套得比较深,如果我们想看这个大对象中有没有这个属性,需要一层层地打开才能看到有没有这个属性,我们可以把一个对象扁平化,把大对象的所有属性抽取出来组成一个对象。这样查看起来会方便很多。
var _toString = Object.prototype.toString;
Z.isObject = function(obj) {
return _toString.call(obj) === '[object Object]';
}
Z.keys = function(obj) {
if(!Z.isObject(obj)) return;
if(Object.keys) {
return Object.keys(obj);
}
else {
var result = [];
var index = 0;
for(var key in obj) {
_hasOwnProperty.call(obj,key) && (result[index++] = obj[key]);
}
return result;
}
}
Z.flatten = function(obj,overwrite) {//键值越前越深就可能会被后面的覆盖
if(!Z.isObject(obj)) {
return ;
}
var keys = Z.keys(obj);
var len = keys.length;
var result = {};
for(var index = 0; index < len; index++) {
var value = obj[keys[index]];
if(Z.isObject(value)) {
var ret = Z.flatten(value,overwrite);
var _keys = Z.keys(ret);
var _len = _keys.length;
for(var _index = 0; _index<_len;_index++) {
var _key = _keys[_index];
(result[_key] && !overwrite) || (result[_key] = ret[_key]);
}
}
else {
(result[keys[index]] && !overwrite) || (result[keys[index]] = value);
}
}
return result;
}