获取对象键和父对象 javascript 的值并创建一个新对象
get value of object key and parent javascript and create a new object
我有一个如下所示的对象:
const testObject = {
"NameA": {
"Name": {
"_text": "Peter"
}
},
"AgeA": {
"_comment": "line=2",
"age": {
"_text": "21"
}
},
"Birth": {
"_comment": "line=3",
"Birthday": {
"DateTimeSignUTCOffset": {
"Date": {
"_text": "191201"
},
"Time": {
"_text": "1123"
},
},
"Test": {
"Code": {
"_text": "1234"
}
},
}
}
}
我正在尝试查找具有键 _text
的任何键并获取相应的值和父键。
即
const result = {
"Name": "Peter",
"age": "21",
"Date": "191201",
"Time": "1123",
"Code": "1234"
};
我已经通过遍历对象尝试了以下操作,但无法弄清楚。
const result = {};
const find_items = (object) => {
console.log(Object.keys(object));
Object.keys(object).map((item) => {
console.log(object[item]);
if(object[item] !== '_text') {
find_items(object[item])
} else {
console.log(item)
}
});
};
find_items(testObject);
console.log(result);
有人能给我指出正确的方向吗?
用英语,你要做的是:
创建一个名为“result”的空对象,然后递归遍历“object”对象。每次遇到链接到具有 __text 字段的 sub-object 的键时,将其添加到“结果”对象。
现在把上面的翻译成JavaScript。
这里的关键词是“递归”。您的原始代码不是递归的。
你的想法很不错,但你想在对象内嵌套的任何地方找到 _text
键。要查找内部嵌套键,如果某个键的值恰好是对象,则需要递归函数。
result = {}
find_text_keys = (haystack, label) => {
Object.keys(ob).forEach(key => {
if (key === '_text') {
res[text] = ob["_text"];
} else if (typeof(ob[key]) === "object") {
find_text_keys(ob[key], key);
}
});
}
然后,使用默认标签 f(object, "default_label")
调用函数将根据需要填充 result
字典。
您可以采用递归方法检查对象,如果 _text
属性 存在,则使用外键获取值或从对象的递归调用中获取条目。
最后从所有条目构建一个对象。
const
flatEntries = object => Object
.entries(object)
.flatMap(([k, v]) => {
if (v && typeof v === 'object') return '_text' in v
? [[k, v._text]]
: flatEntries(v);
return [];
});
testObject = { NameA: { Name: { _text: "Peter" } }, AgeA: { _comment: "line=2", age: { _text: "21" } }, Birth: { _comment: "line=3", Birthday: { DateTimeSignUTCOffset: { Date: { _text: "191201" }, Time: { _text: "1123" } }, Test: { Code: { _text: "1234" } } } } },
result = Object.fromEntries(flatEntries(testObject));
console.log(result);
我有一个如下所示的对象:
const testObject = {
"NameA": {
"Name": {
"_text": "Peter"
}
},
"AgeA": {
"_comment": "line=2",
"age": {
"_text": "21"
}
},
"Birth": {
"_comment": "line=3",
"Birthday": {
"DateTimeSignUTCOffset": {
"Date": {
"_text": "191201"
},
"Time": {
"_text": "1123"
},
},
"Test": {
"Code": {
"_text": "1234"
}
},
}
}
}
我正在尝试查找具有键 _text
的任何键并获取相应的值和父键。
即
const result = {
"Name": "Peter",
"age": "21",
"Date": "191201",
"Time": "1123",
"Code": "1234"
};
我已经通过遍历对象尝试了以下操作,但无法弄清楚。
const result = {};
const find_items = (object) => {
console.log(Object.keys(object));
Object.keys(object).map((item) => {
console.log(object[item]);
if(object[item] !== '_text') {
find_items(object[item])
} else {
console.log(item)
}
});
};
find_items(testObject);
console.log(result);
有人能给我指出正确的方向吗?
用英语,你要做的是:
创建一个名为“result”的空对象,然后递归遍历“object”对象。每次遇到链接到具有 __text 字段的 sub-object 的键时,将其添加到“结果”对象。
现在把上面的翻译成JavaScript。
这里的关键词是“递归”。您的原始代码不是递归的。
你的想法很不错,但你想在对象内嵌套的任何地方找到 _text
键。要查找内部嵌套键,如果某个键的值恰好是对象,则需要递归函数。
result = {}
find_text_keys = (haystack, label) => {
Object.keys(ob).forEach(key => {
if (key === '_text') {
res[text] = ob["_text"];
} else if (typeof(ob[key]) === "object") {
find_text_keys(ob[key], key);
}
});
}
然后,使用默认标签 f(object, "default_label")
调用函数将根据需要填充 result
字典。
您可以采用递归方法检查对象,如果 _text
属性 存在,则使用外键获取值或从对象的递归调用中获取条目。
最后从所有条目构建一个对象。
const
flatEntries = object => Object
.entries(object)
.flatMap(([k, v]) => {
if (v && typeof v === 'object') return '_text' in v
? [[k, v._text]]
: flatEntries(v);
return [];
});
testObject = { NameA: { Name: { _text: "Peter" } }, AgeA: { _comment: "line=2", age: { _text: "21" } }, Birth: { _comment: "line=3", Birthday: { DateTimeSignUTCOffset: { Date: { _text: "191201" }, Time: { _text: "1123" } }, Test: { Code: { _text: "1234" } } } } },
result = Object.fromEntries(flatEntries(testObject));
console.log(result);