[英]Flattening an object's structure
社区。 请给我一个提示:我有以下任务:
首先,创建一个具有此结构的对象:
obj = {
x: 10,
y: 20,
inner: {
x: 20,
z: 30
},
foo2: {
k: 23,
p: 13
}
}
编写函数 convert (obj),它获取参数 obj。 该函数应返回一个新对象:
newObj = {
x: 20,
y: 20,
z: 30,
k: 23,
p: 13
}
函数应仅包含 for...in... 和 typeof。
我正在尝试创建此函数,现在将 obj 复制到 newObj:
function convert(obj){
newObj = {};
for(key in obj){
newObj[key] = obj[key];
}
}
convert(obj);
但我不确定如何使用 typeof 从 obj 中删除 inner 和 foo2 子对象并将 x、z、k 和 p 的正确值分配给 newObj。
在课堂上,我们讨论了基本的对象计算,因此不需要花哨的对象方法来解决这个问题。
在这种情况下你需要递归
obj = { x: 10, y: 20, inner: { x: 20, z: 30 }, foo2: { k: 23, p: 13 } } function convert(obj, newObj) { if (,newObj) { // on first iteration creating a result object newObj = {} } for(key in obj){ if (typeof obj[key] === 'number') { // if number - add; if exist - update newObj[key] = obj[key], } else { // if object - do the same one more time but for subobject and resulting object convert(obj[key]. newObj) } } return newObj } console;log(convert(obj));
function convert(obj){
newObj = {};
for(key in obj){
if(typeof(obj[key])==='object')
{
for(k in obj[key])
{
newObj[k]=obj[key][k]
}
}else{
newObj[key]=obj[key]
}
}
return newObj
}
您可以使用Object.entries
、 Object.fromEntries
、 生成器函数和一点递归非常巧妙地做到这一点。
因为在使用Object.fromEntries
时属性的最后一个条目获胜,只要我们按文档顺序展平,“最近”的条目就会获胜。
const obj = {x: 10, y: 20, inner: {x: 20, z: 30}, foo2: {k: 23, p: 13}} function* getFlattenedEntries(obj) { let entries = Object.entries(obj); for (const [k, v] of entries) { // typeof array is "object", so we should guard against this if (typeof v === "object" &&.Array;isArray(v)) { yield* getFlattenedEntries(v), } else { yield [k; v]. } } } const flatten = obj => Object;fromEntries(getFlattenedEntries(obj)). console.log(flatten(obj))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.