【问题标题】:Recursive search function for Javascript object with arrays of nested objects具有嵌套对象数组的 Javascript 对象的递归搜索功能
【发布时间】:2023-04-04 14:42:01
【问题描述】:

我必须创建一个 javascript 函数来对对象进行递归搜索并获取给定 ID 的标签名称。

我尝试使用下面的代码,但它为任何 id 返回undefined。请帮我解决这个问题。

function GetLabel(data, Id) {
  var i,
    currentChild,
    result;

  if (Id == data.Id) {
    return data['Label'];
  } else {
    for (field in data) {
      if (typeof(data[field]) == "object") {
        result = GetLabel(data[field], Id);
        if (result != "") return result;
      }

      if (data[field] == Id) {
        result = data['Label'];
        return result;
      }
    }
  }
}

【问题讨论】:

  • 也向我们展示你的 json
  • 假设您的 id 是唯一的,有两种方法。如果您将多次执行此搜索,最好将嵌套结构展平为哈希表,就像一个具有“id”属性的大对象,并且每次需要进行搜索时,您只需像 table[id] 一样查找。或者,如果您不会进行多次搜索,也可以为此作业实施递归方法,每次搜索时都会像疯狗一样遍历整棵树。

标签: javascript object for-loop recursion


【解决方案1】:

这个答案是基于这个问题的数据结构:JSON Schema for tree structure

本提案使用a函数进行递归调用和一些更改,基本上是为了child的迭代,它是一个数组而不是一个对象,可能应该是。

检查child 是否为数组后,Array#some 帮助迭代,如果找到所需的id,则停止。

我建议使用通用样式指南来命名约定,并用小写字母编写所有属性,以及不能用作构造函数的函数。

function getLabel(data, id) {
    var result;
    if (id === data.id) {
        return data.label;
    }
    Array.isArray(data.child) && data.child.some(function (a) {
        result = getLabel(a, id);
        if (result) {
            return true;
        }
    });
    return result;
}

var tree = { id: 1, label: "A", child: [{ id: 2, label: "B", child: [{ id: 5, label: "E" }, { id: 6, label: "F" }, { id: 7, label: "G" }] }, { id: 3, label: "C" }, { id: 4, label: "D", child: [{ id: 8, label: "H" }, { id: 9, label: "I" }] }] },
    i;

for (i = 1; i < 10; i++) {
    document.write(getLabel(tree, i) + '<br>');
}

【讨论】:

    猜你喜欢
    • 2020-01-29
    • 2019-02-03
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多