You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:从指定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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 09:58:10