2

2 つのノード リストを 1 つにマージしようとしましたが、1 つの配列に連結すると、同じノードが 2 つあります。挿入するノードが配列に既に存在する場合、連結は検索しません...

var firstNodelist = document.querySelectorAll("#outter, #inner");
var finalArray = new Array();

for (var i = 0; i < firstNodelist.length; i++) {

    var secondNodelist = firstNodelist[i].querySelectorAll("div");

    var firstArray = new Array();

    for (var x = 0; x < secondNodelist.length; x++) {

        firstArray.push(secondNodelist[x]);

    }

    finalArray = finalArray.concat(firstArray)

}

console.log("FINAL", finalArray);

jsfiddle の例

4

1 に答える 1

3

ループ内に 2 番目の不要な配列を作成するのではなく、その内側のループを使用してノードが既に配列内にあるかどうかを確認し (Array#indexOf最新のすべてのブラウザーで)、そうでない場合にのみ追加します。

var firstNodelist = document.querySelectorAll("#outter, #inner");
var finalArray = []; // `[]` rather than `new Array()`

for (var i = 0; i < firstNodelist.length; i++) {

    var secondNodelist = firstNodelist[i].querySelectorAll("div");

    for (var x = 0; x < secondNodelist.length; x++) {

        // Get this node
        var node = secondNodeList[x];

        // Is it in the array already?
        if (finalArray.indexOf(node) === -1) {
            // No, put it there
            finalArray.push(node);
        }

    }
}

console.log("FINAL", finalArray);

ターゲット環境をテストして、Array#indexOf.


そうは言っても、その特定の状況にはもっと良い方法がありますライブソース

var finalArray = Array.prototype.slice.call(
    document.querySelectorAll("#outter div, #inner div")
);

...内部にquerySelectorAllある場合でも、同じノードを複数回含めることはありません(またはその逆)。(これは、配列のようなオブジェクトから真の配列を取得するためのトリックです。)#inner#outterArray.prototype.slice.call(someObject)

于 2013-10-13T15:05:26.610 に答える