求编写JavaScript脚本提取指定嵌套数据对象生成新对象
从嵌套对象中提取指定嵌套对象的JavaScript实现
需求说明
编写JavaScript脚本,从包含多个嵌套对象的父对象中,提取指定名称的嵌套对象(保留完整键名与所有属性值)并生成新对象。此前克隆时因仅提取值导致丢失键名,无法保留结构。
示例数据
const parentObject = { "J Doe Company": { "lastUpdate": "01/05/2023", "website": "jdoecompany.com", "userID": "jdoe1985@gmail.com", "password": "igfndhsi1985", "primaryCC": "Discover", "secondaryCC": "Capital One", "primaryBank": "Chase", "secondaryBank": "", "sq1": "Year Graduated HS", "sa1": "1985", "sq2": "", "sa2": "", "notes1": "Sample password record", "notes2": "" }, "Bob The Builder": { "lastUpdate": "01/05/2023", "website": "bobthebuilder.com", "userID": "bobthebuilder@gmail.com", "password": "bbob1985", "primaryCC": "Amazon Visa", "secondaryCC": "Mastercard", "primaryBank": "Wells Fargo", "secondaryBank": "", "sq1": "First Girlfriend's Name", "sa1": "Kaye", "sq2": "", "sa2": "", "notes1": "Sample password record", "notes2": "" }, "SpongeBob Square Pants": { "lastUpdate": "01/07/2023", "website": "spongebobsquarepants.com", "userID": "spongebob@gmail.com", "password": "spongebob1999", "primaryCC": "None/Not Applicable", "secondaryCC": "", "primaryBank": "None/Not Applicable", "secondaryBank": "", "sq1": "Year show debuted on TV", "sa1": "1999", "sq2": "", "sa2": "", "notes1": "Animated TV show for kids", "notes2": "" } };
解决方案代码
// 提取指定嵌套对象并生成新对象的函数 function extractNestedObject(parentObj, targetKey) { // 检查目标键是否存在于父对象中 if (!parentObj.hasOwnProperty(targetKey)) { return null; // 不存在则返回null } // 深克隆目标对象,避免原对象被修改 const clonedValue = JSON.parse(JSON.stringify(parentObj[targetKey])); // 创建新对象并保留原键名 const newObject = {}; newObject[targetKey] = clonedValue; return newObject; } // 使用示例:提取"SpongeBob Square Pants"对应的对象 const extractedObj = extractNestedObject(parentObject, "SpongeBob Square Pants"); console.log(extractedObj);
代码说明
- 保留键名:通过创建新对象并将目标键名与克隆后的值绑定,解决了之前仅提取值丢失键名的问题。
- 深克隆:使用
JSON.parse(JSON.stringify())实现深克隆,确保新对象的属性修改不会影响原父对象。如果对象中包含函数、Symbol等特殊类型,可替换为递归克隆函数。 - 存在性检查:先判断目标键是否存在,避免访问不存在的属性导致错误。
输出结果
{ "SpongeBob Square Pants": { "lastUpdate": "01/07/2023", "website": "spongebobsquarepants.com", "userID": "spongebob@gmail.com", "password": "spongebob1999", "primaryCC": "None/Not Applicable", "secondaryCC": "", "primaryBank": "None/Not Applicable", "secondaryBank": "", "sq1": "Year show debuted on TV", "sa1": "1999", "sq2": "", "sa2": "", "notes1": "Animated TV show for kids", "notes2": "" } }
内容的提问来源于stack exchange,提问作者user14825633
相关产品推荐
相关产品推荐

