求助:从指定JSON中提取符合条件的结构化数据(JS代码优化)
结构化JSON数据提取逻辑修正与优化
我拥有一份结构复杂的JSON数据,需从中提取满足以下条件的文本信息:
resource-id包含"com.shazam.android:id/"- 属性属于
["title", "subtitle", "datetime"]集合;若元素无datetime则不添加该字段
已提供初始JavaScript代码、期望输出的JSON结构及修改后的代码,请求协助完成数据提取逻辑的修正与优化,得到目标结构化数据。
初始代码
const check = (obj, keys) => !keys.some((el) => !obj.hasOwnProperty(el)); const isObjectEmpty = (objectName) => { return ( objectName && Object.keys(objectName).length === 0 && objectName.constructor === Object ); }; const getChildren = (el, replaceText, props, resorceIdFinal) => { var arr = []; el.forEach((el) => { let resorceId = getResorceId(el.attributes, replaceText, props, resorceIdFinal); if(!isObjectEmpty(resorceId)) arr.push(resorceId); //console.log(arr); getChildren(el.children, replaceText, props, resorceIdFinal); }); return arr; }; const getResorceId = (el, replaceText, props, resorceIdFinal) => { var o = {}; if (el["resource-id"] !== undefined) { var resorceId = el["resource-id"].replace(replaceText, ""); if (props.includes(resorceId)) { o = { [resorceId]: el.text }; } } return o; }; function readPro(json, replaceText, props, filterA, resorceIdFinal) { var arr = []; json.forEach((el) => { arr.push(getChildren(el.children, replaceText, props, resorceIdFinal)); }); console.log(arr) filtered = arr.filter( ((s) => (o) => ((k) => !s.has(k) && s.add(k))(filterA.map((k) => o[k]).join("|")))( new Set() ) ); return filtered; } var res = readPro( a.children, "com.shazam.android:id/", ["title", "subtitle", "datetime"], ["title", "subtitle"], "datetime" ); console.log(res);
期望输出JSON
[ { "title": "Believe", "subtitle": "Chuther", "datetime": "12 giu, 16:42" }, { "title": "시작 (Inst.)", "subtitle": "Gaho", "datetime": "12 giu, 16:42" }, { "title": "Give It Up", "subtitle": "KC and the Sunshine Band", "datetime": "12 giu, 16:41" }, { "title": "GRAVITY", "subtitle": "Jong Ho", "datetime": "12 giu, 16:41" } ]
修改后代码
const isObjectEmpty = (objectName) => ( objectName && Object.keys(objectName).length === 0 && objectName.constructor === Object ); const getResorceId = (el, replaceText, props, value) => { if (el["resource-id"] !== undefined) { var resorceId = el["resource-id"].replace(replaceText, ""); if (props.includes(resorceId)) { return { [resorceId]: el[value] }; } } return {}; }; const getChildren = (el, replaceText, props, value) => { var arr = []; el.forEach((el) => { let resorceId = getResorceId(el.attributes, replaceText, props, value); var o = {} if (!isObjectEmpty(resorceId)) { arr.push(resorceId); for (const [_, value] of Object.entries(arr)) { for (const [key, value2] of Object.entries(value)) o[key] = value2 } arr = [o] } arr.push(...getChildren(el.children, replaceText, props, value)); }); //console.log(arr.length, arr) //if(arr.length === 1 && !Object.hasOwn(...arr, resorceIdFinal)) arr = [] return arr }; function readPro(json, replaceText, props, filterA, value) { var arr = []; json.forEach((el) => { arr.push(...getChildren(el.children, replaceText, props, value)); }); filtered = arr.filter( ((s) => (o) => ((k) => !s.has(k) && s.add(k))(filterA.map((k) => o[k]).join("|")))( new Set() ) ); return filtered; } var rA = readPro( a.children, "com.shazam.android:id/", ["title", "subtitle", "datetime"], ["title", "subtitle"], "text" );
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

