具有嵌套对象数组的Javascript对象的递归搜索功能

时间:2016-05-12 05:34:46

标签: javascript object for-loop recursion

我必须创建一个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;
      }
    }
  }
}

1 个答案:

答案 0 :(得分:0)

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

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

检查child是否为数组后,如果找到所需的idArray#some会有助于迭代并停止。

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

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>');
}