【问题标题】:JS: Possible to iterate through nested children elements, but find the deepest element first?JS:可以遍历嵌套的子元素,但首先找到最深的元素?
【发布时间】:2015-09-10 22:35:12
【问题描述】:

背景

我有一系列包含许多嵌套子元素的对象。我需要找出这些子元素中的哪些是“后退”按钮,我已经用标签属性 = 'backbtn' 来标识它。

一旦我找到了这个孩子,我就会对其执行一系列任务。

现在我成功地使用这段代码来遍历我的对象以找到一个具有标签属性'backbtn'的孩子

编辑:添加示例数据

var anotherchild = {
  name: 'Alexander',
  age: '99',
  label:'backbtn'
};
var firstchild = {
  name: 'Smith',
  age: '10',
  child: another child,
  label:'backbtn'
};
var a = {
  name: 'John',
  age: '32',
  child: first child,
  label:'backbtn'
};


function find(haystack, needle) {
  if (haystack.label === needle) {return haystack; }
  for (var i = 0; i < haystack.children.length; i ++) {
    var result = find(haystack.children[i], needle);
    if (result) { return result; }
  }
  return null;
}


find(myContent, "backbtn").fireEvent('click');

问题

现在我的问题是,当我有几个孩子被标记为“backbtn”时,上面的函数将简单地匹配它找到的第一个并返回它。

我实际上需要反过来,首先找到最深的元素。

这样的事情可能吗?

【问题讨论】:

  • 你试过递归吗?
  • “有一系列包含许多嵌套子元素的对象。我需要找到这些子元素中的哪些是“后退”按钮,我用标签属性标识了它= 'backbtn'" 可以在问题中包含“对象”的示例吗?
  • 您无法在父母之前找到孩子,因为只有通过父母才能找到孩子。因此,找到最深 X 的唯一方法是找到所有 X,然后查看哪个是最深的,并在最后使用那个。
  • @guest271314 肯定是这样的。 var a = { name:'John', age:'32', child:firstchild}; var firstchild = { name:'Smith', age:'10', child:another child, label:'backbtn'}; var anotherchild = { name:'Alexander', age:'99', child:etc, label:'backbtn'};因此,在搜索“backbtn”时,它应该有望得到 Alexander(使用我上面的函数,它会得到 Smith
  • 你如何定义“最深”?在检查父级之前先搜索子级很容易,但这仍然可以返回向下两层的结果,在树的后面三层向下匹配。

标签: javascript


【解决方案1】:

尝试递归使用Object.hasOwnProperty(),直到找不到匹配项

var anotherchild = {
  name: 'Alexander',
  age: '99'
};
var firstchild = {
  name: 'Smith',
  age: '10',
  child: anotherchild
};
var a = {
  name: 'John',
  age: '32',
  child: firstchild
};

function found(obj) {
  alert(JSON.stringify(obj))
}

(function find(obj) {
  if (obj.hasOwnProperty("child")) {
    find(obj.child)
  } else {
    found(obj)
  }
}(a));

【讨论】:

  • 您缺少检查 label 等于 needle
  • @torazaburo "你错过了对label 等于needle 的检查。" 如果正确解释问题,现有的find 函数中包含严格的相等检查在 OP,这似乎没有返回预期的结果?请参阅stackoverflow.com/questions/32493317/…“它应该有望导致 Alexander”
  • @torazaburo 是正确的,它需要实际检查标签 = 针。这是因为中间还有许多其他对象需要忽略
  • @Mark "@torazaburo 是正确的,它需要实际检查 label = needle。这是因为中间还有许多其他对象需要忽略" ?不确定是否正确解释评论? js 在 stacksn-ps 不返回预期结果?请参阅 处的 OP“它应该有望导致 Alexander”
猜你喜欢
  • 2020-04-19
  • 1970-01-01
  • 2019-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多