gpt4 book ai didi

javascript - 引用父对象展平嵌套对象

转载 作者:行者123 更新时间:2023-12-03 00:45:41 25 4
gpt4 key购买 nike

我想压平下面的

let o = {
name: "John",
school: {
name: "Phillps",
}
};

至:

{
name: "John",
schoolName: "Phillps"
}

我的代码如下所示

f= Object.assign({}, ..._flatten(o));

function _flatten(o) {
return [].concat(
...Object.keys(o).map(k =>
typeof o[k] === "object" ? _flatten(o[k]) : { [k]: o[k] }
)
);
}

这会产生

{  
name: "Phillps"
}

如您所见,它无法处理嵌套对象中属性名称的冲突。 IE。学生的名字被学校的名字覆盖。是否可以修改代码,使深层属性以其父对象名称为前缀?

最佳答案

您可以使用Object.entries , Array.prototype.flatMapObject.fromEntries

const upperFirst = (str = "") =>
str[0] .toUpperCase () + str.substr(1)

const camelCase = ([ first = "", ...rest ]) =>
first + rest .map (upperFirst) .join ('')

const append = (xs, x) =>
xs .concat ([ x ])

const flatten = (o = {}) =>
{ const loop = (o, path) =>
Object (o) === o
? Object .entries (o) .flatMap
( ([ k, v ]) =>
loop
( v
, append (path, k)
)
)
: [ [ camelCase (path), o ] ]
return Object .fromEntries (loop (o, []))
}

console.log
( flatten
( { name: "John"
, school:
{ name: "Phillips"
, district: { zone: 1 }
}
}
)
)

// { "name": "John"
// , "schoolName": "Phillips"
// , "schoolDistrictZone": 1
// }

flatMap 急切地评估输入并在 flatten 返回之前创建一些中间值。因为 Object.fromEntries 接受任何可迭代对象,所以我们最好使用生成器编写 loop

const flatten = (o = {}) =>
{ const loop = function* (o, path)
{ if (Object (o) === o)
for (const [ k, v ] of Object .entries (o))
yield* loop
( v
, append (path, k)
)
else
yield [ camelCase (path), o ]
}
return Object .fromEntries (loop (o, []))
}

重新运行程序,您将看到完全相同的输出。另外值得一提的是两个程序之间的结构相似性。

关于javascript - 引用父对象展平嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53255765/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com