前言
有时候后台返回前端的数据结构嵌套层数过深,访问里面的属性的时候过于复杂,于是乎就有了深层数组及对象的扁平化方式。
数组扁平化
简单版本实现:
function flatten(array, result) {
result = result || [];
array.forEach(element => {
if (Array.isArray(element)) {
flatten(element, result);
} else {
result.push(element);
}
});
return result;
}
var arr = [2, [3, 4],
[
[5],
[6]
]
];
var result = flatten(arr);
console.log(result);
输出结果为:

underscore实现源码:
// Internal implementation of a recursive `flatten` function.
var flatten = function(input, shallow, strict, output) {
output = output || [];
var idx = output.length;
for (var i = 0, length = getLength(input); i < length; i++) {
var value = input[i];
if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) {
// Flatten current level of array or arguments object.
if (shallow) {
var j = 0, len = value.length;
while (j < len) output[idx++] = value[j++];
} else {
flatten(value, shallow, strict, output);
idx = output.length;
}
} else if (!strict) {
output[idx++] = value;
}
}
return output;
};
对象扁平化
/* 题目*/
var entryObj = {
a: {
b: {
c: {
dd: 'abcdd'
}
},
d: {
xx: 'adxx'
},
e: 'ae'
}
}
// 要求转换成如下对象
var outputObj = {
'a.b.c.dd': 'abcdd',
'a.d.xx': 'adxx',
'a.e': 'ae'
}
简单实现一个深层对象的扁平化
function flattenObj(obj, tempKey, resultObj) {
tempKey = tempKey || '';
resultObj = resultObj || {};
for (let key in obj) {
var value = obj[key];
if (typeof value == 'object') {
tempKey = tempKey + key + '.';
flattenObj(value, tempKey, resultObj);
tempKey = '';
} else {
tempKey = tempKey + key;
resultObj[tempKey] = value;
}
};
return resultObj;
}
以上写法有问题,下面一种写法是评论区的,粘贴到这里:
function flat(obj, key = "", res = {}, isArray = false) {
for (let [k, v] of Object.entries(obj)) {
if (Array.isArray(v)) {
let tmp = isArray ? key + "[" + k + "]" : key + k
flat(v, tmp, res, true)
} else if (typeof v === "object") {
let tmp = isArray ? key + "[" + k + "]." : key + k + "."
flat(v, tmp, res)
} else {
let tmp = isArray ? key + "[" + k + "]" : key + k
res[tmp] = v
}
}
return res
}
测试代码
var entryObj = {
a: {
b: {
c: {
dd: 'abcdd'
}
},
d: {
xx: 'adxx'
},
e: 'ae'
}
};
var result = flattenObj(entryObj);
console.log(result);
输出结果
