2016-05-31 11 views
7

sto cercando di concat due nodelists utilizzandoCONCAT due nodelists

var ul = document.querySelector("ul"); 
var down = document.getElementsByClassName("mobile")[0]; 
var ul_child = Array.prototype.concat.call(ul.children,down.children); 

Ma questo restituisce solo due nodi da nodelist ul e ignorare gli altri. Qual è il più valido per concatenare due nodelsits? Vorrei evitare di eseguire il ciclo bruteo

+0

Non si può mutare gli elenchi dei nodi e dei parametri per '.concat()' deve essere Array perché siano appiattiti nel risultato. Cosa c'è di sbagliato in un ciclo? –

+1

'const ulChild = Array.from (ul.children) .concat (Array.from (down.children));' – ndugger

+0

@ndugger: Hai l'unica risposta corretta qui * (o è stata fatta fino a War10ck aggiornato) *. –

risposta

11

Perché non si usa un selettore per selezionarli nello stesso momento in cui non è necessario concatenarli e si finisce con una raccolta HTML invece di una matrice.

var elems = document.querySelectorAll("ul > li, .mobile > *"); 
 
console.log(elems);
<ul><li>x</li></ul> 
 
<div class="mobile">y</div>

+1

Questo presuppone che ce n'è solo uno di ciascuno, sebbene tu abbia bisogno di '> *' in ogni singolo selettore per ottenere i bambini, che è l'obiettivo nella domanda. –

+2

Questo dovrebbe essere un commento, non una risposta. – ndugger

+1

@ndugger continua a concatenarli con un solo passaggio. Penso che sia una risposta. Certo, potresti usare gli hack dell'array, ma in questo caso non si tratta di una raccolta HTML che può essere o non essere una buona cosa. – epascarello

5

È possibile provare la conversione dei due NodeList oggetti agli array prima. Poi chiamando concat sui risultati:

// Convert the first list to an array 
var ul_list = document.querySelector("ul"), 
    ul_children_array = Array.prototype.slice.call(ul_list.children); 

// Convert the second list to an array 
var down_list = document.getElementsByClassName("mobile")[0], 
    down_children_array = Array.prototype.slice.call(down_list.children); 

var ul_child_array = Array.prototype.concat.call(ul_children_array, down_children_array); 
+2

Stai tagliando un elemento, non un elenco di elementi. Metti il ​​'.children' nella sezione, quindi usa solo concat sugli array –

+2

@squint Good catch. Grazie. Non l'ho notato nella mia copia/incolla. Grazie anche per il suggerimento di ottimizzazione. – War10ck

1

L'operatore diffusione ES6 rende questo pulite & ordinato:

var elems = [ 
    ...document.querySelectorAll(query1), 
    ...document.querySelectorAll(query2) 
];