Javascript getElementsByClassName,递归,一个参数,无下划线.js

Javascript getElementsByClassName,递归,一个参数,无下划线.js,javascript,recursion,Javascript,Recursion,我正在尝试编写getElementsByClassName(),而不使用getElementsByClassName方法或。方法。我想对只有一个参数的函数使用递归,然后将每个值推送到一个数组中。后记返回该数组。下面是到目前为止我的代码。我试过几个版本,我做错了什么?谢谢你的帮助 我意识到这个问题以前有人问过,也有人回答过。但是,我尝试只使用一个参数编写函数,其他人使用两个参数。我也在用no!。下划线方法,其他方法使用下划线。我需要使用递归,不使用下划线,只使用一个参数,并且不能使用getElem

我正在尝试编写
getElementsByClassName()
,而不使用
getElementsByClassName
方法或。方法。我想对只有一个参数的函数使用递归,然后将每个值推送到一个数组中。后记返回该数组。下面是到目前为止我的代码。我试过几个版本,我做错了什么?谢谢你的帮助

我意识到这个问题以前有人问过,也有人回答过。但是,我尝试只使用一个参数编写函数,其他人使用两个参数。我也在用no!。下划线方法,其他方法使用下划线。我需要使用递归,不使用下划线,只使用一个参数,并且不能使用
getElementsByClassName
方法。我已经为此工作了很长一段时间,希望能得到一些帮助,谢谢

var getElementsByClassName = function(className) {
  var nodeArray = [];
  var fakeNode = [1,2,3,4,5,6,7];

  // var variableNode = document.getElementsByClassName(className); // ['element 1', 'element 2', 'element 3']

  if(document.nodeName === className) {
  var variableNode = document.querySelector(className);

  // base case: 
    if (variableNode.length === 0) {
        return [];

  // rec case:
    } else {
        for(var i = 0; i < variableNode.length; i++) {
            nodeArray.push(variableNode[i]);
        }
        getElementsByClassName();
    }
  }
  return nodeArray;
};
var getElementsByClassName=函数(类名){
变量noderray=[];
var fakeNode=[1,2,3,4,5,6,7];
//var variableNode=document.getElementsByClassName(className);//['element 1','element 2','element 3']
if(document.nodeName==类名){
var variableNode=document.querySelector(类名);
//基本情况:
if(variableNode.length==0){
返回[];
//rec案例:
}否则{
对于(var i=0;i
为了递归地执行此操作,您需要通过DOM层次结构进行递归。这意味着函数必须从一个DOM节点开始,然后对其所有子节点进行递归调用。在每个级别上,它创建一个结果数组;如果与条件匹配,它将添加当前节点,连接子节点的结果,然后返回此结果

函数getElementsByCassName(类名,节点=文档){ 变量noderray=[]; if(node.classList&&node.classList.contains(className)){ noderray.push(节点); } if(节点子节点){ 对于(var i=0;ie.id)); log(getElementsByClassName(“b”).map(e=>e.id))

abc
def
标题

为了递归地执行此操作,您需要通过DOM层次结构进行递归。这意味着函数必须从一个DOM节点开始,然后对其所有子节点进行递归调用。在每个级别上,它创建一个结果数组;如果与条件匹配,它将添加当前节点,连接子节点的结果,然后返回此结果

函数getElementsByCassName(类名,节点=文档){ 变量noderray=[]; if(node.classList&&node.classList.contains(className)){ noderray.push(节点); } if(节点子节点){ 对于(var i=0;ie.id)); log(getElementsByClassName(“b”).map(e=>e.id))

abc
def
标题


你为什么要重新发明轮子?。查看polyfill版本如果你想通知某人你已经发表了评论,你必须在他们的名字前加上@。@Li357上面的回答也与DOM无关,这就是我问这个问题的原因。我为你重新编排了实际问题的格式。但是,我在标题中没有使用下划线,只有一个参数,并且使用递归进行澄清。请你重新开始这个问题好吗?谢谢,参数的数量无关紧要。递归时,必须返回递归调用的值,例如,
return getElementsByClassName(…)。但是每次都需要使用不同的参数——递归调用必须使您更接近基本情况。为什么您认为这里需要递归?为什么要重新发明轮子?。查看polyfill版本如果你想通知某人你已经发表了评论,你必须在他们的名字前加上@。@Li357上面的回答也与DOM无关,这就是我问这个问题的原因。我为你重新编排了实际问题的格式。但是,我在标题中没有使用下划线,只有一个参数,并且使用递归进行澄清。请你重新开始这个问题好吗?谢谢,参数的数量无关紧要。递归时,必须返回递归调用的值,例如,
return getElementsByClassName(…)。但是每次都需要使用不同的参数——递归调用必须使您更接近基本情况。为什么您认为这里需要递归?感谢您花时间回答,我如何仅使用一个参数?我能只用一个参数吗?我不知道这怎么可能?我不这么认为。您需要为每次调用更改一个参数,并且您还需要为正在查找的类指定一个参数。请注意,第二个参数有一个默认值。因此,您可以调用
getElementsByClassName(“someclass”)
,它将默认为
document
节点。然后它将在递归时使用非默认参数。好的,谢谢您的解释。非常感谢!当我把它放在sublime中,在spec.html文档中运行它,或者在chrome调试器代码段中运行它时,它会返回为未定义的contains?我做错了什么。我也尝试过使用contains(“.”+className)。但是,这也不起作用。谢谢你花时间回答,我怎样才能只用一个参数呢?我能只用一个参数吗?我不知道这怎么可能?我不这么认为。您需要为每次调用更改一个参数,并且您还需要为正在查找的类指定一个参数