数据扁平化面试题
- 数据扁平化,输入可以是一个对象或一个数组,去掉对象中的null和undefined值,输出一个扁平化对象
// var input = [
// 'test',
// null,
// 12,
// [
// 1,
// 2,
// {
// d010: 10,
// d011: 20,
// d012: [
// 10,
// 20,
// {
// d0120: 40,
// d0121: 50
// }
// ]
// },
// [
// 1, 30, 50
// ]
// ],
// 'hello world'
// ]
var input = {
a: 10,
b: {
b0: 10,
b1: null,
b2: [
1,
2,
{
b201: 10,
b202: [10, 20, 30],
b203: 30
}
],
b3: {
b30: 10,
b31: 20
}
},
c: null,
d: [
'test',
null,
12,
[
1,
2,
{
d010: 10,
d011: 20
},
[
1, 30, 50
]
],
'hello world'
],
e: undefined,
f: 'test',
h: '',
i: 0,
f: [
'test',
null,
12,
[
1,
2,
{
d010: 10,
d011: 20,
d012: [
10,
20,
{
d0120: 40,
d0121: 50
}
]
},
[
1, 30, 50
]
],
'hello world'
]
}
function isNotEmpty(_obj) {
return _obj !== null && _obj !== undefined
}
/** 判断是否为对象 */
const isObject = _obj => Object.prototype.toString.call(_obj).replace('[object ', '').replace(']', '') === 'Object'
/** 递归我们的对象 */
function loopObject(_obj, _key) {
let newObj = {}
for (let _name in _obj) {
let _item = _obj[_name]
if (isNotEmpty(_item)) {
let __key = !!_key ? _key + '.' + _name : _name
if (isObject(_item)) {
// let _newObj = loopObject(_item)
// 对象合并
// newObj = {...newObj, ..._newObj}
// Object.assign(newObj, _newObj)
// 最终方法
// Object.assign(newObj, loopObject(_item, _name))
Object.assign(newObj, loopObject(_item, __key))
// for (let __name in _item) {
// let __item = _item[__name]
// if (isNotEmpty(__item)) {
// newObj[_name + '.' + __name] = __item
// }
// }
} else if (isArray(_item)) {
Object.assign(newObj, loopArray(_item, __key))
} else {
newObj[__key] = _item
}
}
}
return newObj
}
/** 判断数组的方法 */
const isArray = _obj => Object.prototype.toString.call(_obj).replace('[object ', '').replace(']', '') === 'Array'
/** 递归我们的数组 */
function loopArray(_arr, _key) {
let newObj = {}
_arr.forEach(function(_item, _i) {
if (isNotEmpty(_item)) {
let __key = !_key ? `[${_i}]` : _key + `[${_i}]`
if (isArray(_item)) {
Object.assign(newObj, loopArray(_item, __key))
} else if (isObject(_item)) {
Object.assign(newObj, loopObject(_item, __key))
} else {
newObj[__key] = _item
}
}
})
return newObj
}
function flatten(_ipt) {
let newObj = {}
if (isArray(_ipt)) {
newObj = loopArray(_ipt)
} else if (isObject(_ipt)) {
newObj = loopObject(_ipt)
} else {
newObj = _ipt
}
// '[3]': [ 1, 2, { d010: 10, d011: 20 }, [ 1, 30, 50 ] ],
// '[3][0]': 1
// for (let _name in _ipt) {
// let _item = _ipt[_name]
// if (isNotEmpty(_item)) {
// if (isObject(_item)) {
// for (let __name in _item) {
// let __item = _item[__name]
// if (isNotEmpty(__item)) {
// newObj[_name + '.' + __name] = __item
// }
// }
// } else {
// newObj[_name] = _item
// }
// }
// }
return newObj
}
var output = flatten(input)
console.log(output)