1

タイトルが示すように、個人的な演習として getElementByClassName を書き直そうとしましたが、再帰的な結果の戻りで予期しない動作に遭遇しています。

Document.prototype.getElementsByClassNameExercise = function(className, tempElement){
  var currentElement = (tempElement || document),
    children = currentElement.childNodes,
    results = [],
    classes = [];

  // Loop through children of said element
  for(var i =0;i<children.length;i++){    
    if(children[i].className && children[i].className !== '') {
      classes = children[i].className.split(' ');

      // Important to note, forEach is not ie8 safe.
      classes.forEach(function(singleClass){
        if(singleClass === className) {
          results.push(children[i]);
        }
      });
    }
    results.concat(Document.prototype.getElementsByClassNameExercise.call(this,     className, children[i]));
  }

  return results;
}

私は自分のホームページでこれを試みましたが、すべての DOM 要素を正常に解析して className を見つけたように見えます...しかし、return/ results.concat(results) ステップは失敗したようです。:/

受験者は私が見逃しているものを見ることができますか? :)

4

1 に答える 1

0

あなたの問題

あなたは多くを逃していません。

concat()MDNの記事で説明されているように、新しい配列を返します。

概要

この配列を他の配列や値と結合した新しい配列を返します。

説明

[...] concat は、これまたは引数として提供された配列を変更しませんが、代わりに、元の配列から結合された同じ要素のコピーを含む浅いコピーを返します。

疑問がある場合は、MDN が十分でない場合は、 ECMA-262 仕様(セクション 15.4.4.4) をいつでも参照できます。

0 個以上の引数 item1、item2 などを指定して concat メソッドを呼び出すと、オブジェクトの配列要素とそれに続く各引数の配列要素を順番に含む配列が返されます。

解決

結果変数を再割り当てする必要があります。

この行を変更します。

results.concat(Document.prototype.getElementsByClassNameExercise.call(this,     className, children[i]));

に:

results = results.concat(Document.prototype.getElementsByClassNameExercise.call(this,     className, children[i]));
于 2013-09-05T06:42:06.953 に答える