首页 > 解决方案 > 节点和父链接

问题描述

我有 json 集合,它包含作为数组或键值对的嵌套元素,并且可以嵌套到任意长度。我需要通过一个数组,找到其中的项目并用它们各自的值进行转换。

例如,在下面给出的数组中,我有一个数组

一个只获取值的函数 1. 我将传递这个数组以找出 JSON 集合中的这两个单元格并将它们转换为值。这些值可以在树中的任何位置。我需要拿起单元格及其父节点。它应该搜索它们,将它们各自的值放入其中,这样它就会从 ["TRC030-A", "TRSEE050-A"] 更改为 [22, 12]

一个函数只是总结值 2。请注意有集合,在它们中,单元格是相同的。但如果我在示例中传递“NSEE050-A”、“NSEE060-A”,它应该选择它们并输入值并将它们相加

我需要递归地做这个javascript。亲切的问候,

{   
"MusicVersion": "1.0.0",
"validationVersion": "1.0.0",
"submissionStage": "editing / submitted for approval etc.",
"PiaonoData": { 
         "musicacademies": [
           {
              "name": "Music Name",
            }]
 },
"MainData": { 
  },
  }

标签: windowssocket.ioasync-await

解决方案


您可以使用 aMap将搜索数组中的键映射到同一数组中的索引。该地图将允许快速检查数据中的属性是否与任何属性匹配并给出其索引。它也适用于indexOf,但 Map 更快。

其余的是递归函数:一旦找到所有键就可以退出:

function mapKeys(obj, keys) {
    const map = new Map(keys.map((key, i) => [key, i]));
    const result = [];
    function recur(obj) {
        for (prop in obj) {
            if (Object(obj[prop]) === obj[prop]) {
                recur(obj[prop]);
            } else if (map.has(prop)) {
                result[map.get(prop)] = obj[prop];
                map.delete(prop);
                if (!map.size) return;
            }
        }
    }
    recur(obj);
    return result;
}

// Sample data
const data = {"MusicVersion": "1.0.0","validationVersion": "1.0.0","submissionStage": "editing / submitted for approval etc.","PiaonoData": {"musicacademies": [{"name": "Music Name","id": "Music ID / UPIN","data": "See Example Form Object","SCI040": "newly admitted member"}]},"MainData": {"mainBalance": {"CAATOT" : 0,"AFC020-A": 11,"TRC030-A": 22,"TRC040-A": 33,},"nonMainData": {"TRSEE050-A": 12,"staffEmoluments" : [{"NSEE050-A": 12,"NSEE050-B": 22,"NSEE050-C": 40,"NSEE050-D": 54},{"NGEE050-A": 36,"NGEE050-B": 41,"NGEE050-C": 9,"NGEE050-D": 0},{"NLEE050-A": 1,"NLEE050-B": 3,"NLEE050-C": 7,"NLEE050-D": 9}],"MuiscSpecialPayments": [{"LSRP010-A": 12,"LSRP010-B": 22,"LSRP010-C": 40,"LSRP010-D": 54},{"LDSP010-A": 36,"LDSP010-B": 41,"LDSP010-C": 9,"LDSP010-D": 0},{"LDSP010-A": 1,"LDSP010-B": 3,"LDSP010-C": 7,"LSSP010-D": 9}],"MusicConversions": [{"type": "simple/complex/conversion","TATI010-A": 1,"TATI010-B": 3,"TATI020-A": 7,"TATI030-B": 9}]}},"MusicData": {"AatOverview": { "TATI010-A": 1,"ABCD": 3,"DEF": 7,"KLM": 9},"acOverview":  {"TATI010-A": 1,"ATAATI010-B": 3,"OPQ": 7,"ATAATI030-B": 9,},"musicacademies": [{"name": "Music Name","id": "MusicID","data": "See Example Form Object","MCI040": "Newly admitted"}]},"otherMusicData": { "tbc": null },"MusicCompletionStatuses": { "tbc": null },"MusicValidationExplanations": {"ABC1001": {"fieldValue": "600","userComment": "Extra spend"},"ABS1196": {"fieldValue": "30","userComment": "This is the reason "}},"lastUpdatedBy": "user namer","lastUpdatedDate": "2016-04-23T18:25:43.511Z"};

console.log(mapKeys(data, ["TRC030-A", "NSEE050-A"]));


推荐阅读