jQuery最近的亲戚

时间:2017-03-28 14:59:10

标签: jquery xml

我在一个着名的"中遇到了这个问题。在线访谈网站:

  

以下XML表示系列树:

<James>
     <Dave></Dave>
     <Mike></Mike>
     <Sarah></Sarah> 
</James> 
  

实现nearestRelative函数,使其返回名称与其匹配的父亲最近亲   relativeName并遵守以下规则:

     

parent参数是最接近的jQuery选择器   亲戚将是后代。每个家庭成员,包括   孩子,也可能是一个或多个孩子的父母。孩子们   与孙子女关系更密切。如果好几个   同一代的孩子与第一代孩子的名字相同   树中的孩子被认为是更接近的。如果没有匹配的亲戚   发现该函数应该返回一个空的jQuery对象。例如,   nearestRelative($(&#39; James&#39;),&#39; Mike&#39;)应该返回jquery对象   包裹<Mike></Mike>

     

ECMAScript 5.1,jQuery v3.1.1(以$格式提供)

首先是因为jQuery的find搜索深度,而不是问题提示中所述的第一个广度;我的第一种方法是错误的。然后我为&#34;广度查找&#34; 写了一个递归函数,如下所示:

function closestRelative(parent, relativeName) {
  firstLevel = $(parent).children();
  if (firstLevel.length) {
    result = $(firstLevel).filter(relativeName);
    if (result) {
      return result.first();
    } else {
      closestRelative(firstLevel, relativeName);
    }
  } else {
    return $([]);
  }

}

测试用例的结果:

  

示例案例:正确答案
    几代人:错误答案
    同名儿童:错误答案

我无法找到通过所有3个测试用例的解决方案而且我不知道自己错过了什么,因为我已经搜索了几代并且还没有找到第一个孩子遇到的家庭成员数组。代码有什么问题,如何针对xml测试此函数并获得<Mike></Mike>作为结果?

var xml = $.parseXML("<James><Dave></Dave><Mike></Mike><Sarah></Sarah></James>");
console.log(closestRelative($(xml).children()[0], 'Mike')[0].outerHTML); //Something is wrong here

https://jsfiddle.net/ros9cdvg/

2 个答案:

答案 0 :(得分:2)

测试以下答案给出100%

function closestRelative(parent, relativeName) {
   result = $(parent).find(relativeName);
   if (result.length === 1) {
      return result;
  } else if(result.length > 1) {
      //identify the lowest element by getting the node level index
      // difference between the parent and the child, Use the lowest of that 
      // to return the response  
      var lowest = 0;
      var lowestidx = 0;
      $(result).each(function(idx, item) {
        if(idx===0) {
          lowest = $(item).parents().index(parent);
        }
        else {
             if ($(item).parents().index(parent) < lowest) {
                lowestidx = idx;
               lowest = $(item).parents().index(parent);
             }
           }
      });
      return $([result[lowestidx]]);
  }
  else {
    return $([]);
  }
}

codepen:https://codepen.io/YasirKamdar/pen/zRLNPb

答案 1 :(得分:0)

这一位:

if (result) {
  return result.first();
} else {
  closestRelative(firstLevel, relativeName);
}

需要:

if (result.length) {
  return result.first();
} else {
  return closestRelative(firstLevel, relativeName);
}

然后你将通过所有三个测试用例。

@Hamzaouiii:您的代码将无法正常使用案例<James><Dave><Mike></Mike></Dave><Mike></Mike><Sarah></Sarah></James>,您将返回孙子“迈克”,而不是孩子。

这就是为什么OP的解决方案首先检查子级别然后使用递归向下移动到下一代。