获取对象键和父对象 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);