我们如何实现一个utilflatten
来平这个
myMap = {
'a': 5,
'b': 6,
'c': {
'f': 9,
'g': {
'm': 17,
'n': 3
}
}
}
flatten(myMap) = {
'a': 5,
'b': 6,
'c.f': 9,
'c.g.m': 17,
'c.g.n': 3,
}
?
我发现这里是一个实现https://github.com/lukeed/flattie/blob/master/src/index.js但我无法理解的代码。谁能给我一个更容易读懂的版本?
您可以使用以下代码:
myMap = {
'a': 5,
'b': 6,
'c': {
'f': 9,
'g': {
'm': 17,
'n': 3
}
}
}
function flatten(obj, pKey = null, res = {}) {
for (let key in obj) {
const name = pKey ? `${pKey}.${key}` : key;
if (typeof obj[key] === "object" && !Array.isArray(obj[key])) {
flatten(obj[key], name, res);
} else {
res[name] = obj[key];
}
}
return res;
}
console.log(flatten(myMap))
可以通过flatten(myMap)
使用。事实上,这很简单,但有时它会让人困惑。它的工作原理是通过循环然后检查,如果它是一个对象,然后再次调用自身(递归)来深度创建一个键对象,如果不是,则创建一个键对象,直到那里。
这可能是一个稍微简单的版本:
const inputObject = {
a: 5,
b: 6,
c: {
f: 9,
g: {
m: 17,
n: 3
}
}
}
function flatten(input, keys = [], output = {}) {
for (key in input) {
const value = input[key]
const combinedKeys = [...keys, key]
if (typeof value === 'object') {
output = flatten(value, combinedKeys, output)
} else {
output[combinedKeys.join('.')] = value
}
}
return output
}
console.log(flatten(inputObject))
/* Logs:
* {
* "a": 5,
* "b": 6,
* "c.f": 9,
* "c.g.m": 17,
* "c.g.n": 3
* }
*/
这个想法是递归地查看对象的所有属性,并在我们深入到一个叶子值之前构建一个.
分隔的键。
你可以在这里阅读更多关于递归函数的信息:https://www.freecodecamp.org/news/what-is-recursion-in-javascript/
这里有一个选项:
// Declare an object
myMap = {
'a': 5,
'b': 6,
'c': {
'f': 9,
'g': {
'm': 17,
'n': 3
}
}
}
// Declare a flatten function that takes
// object as parameter and returns the
// flatten object
const flattenObj = (myMap) => {
// The object which contains the
// final result
let result = {};
// loop through the object "ob"
for (const i in myMap) {
// We check the type of the i using
// typeof() function and recursively
// call the function again
if ((typeof myMap[i]) === 'object' && !Array.isArray(myMap[i])) {
const temp = flattenObj(myMa**strong text**p[i]);
for (const j in temp) {
// Store temp in result
result[i + '.' + j] = temp[j];
}
}
// Else store ob[i] in result directly
else {
result[i] = myMap[i];
}
}
return result;
};
console.log(flattenObj(myMap));