Obtenga una matriz de contenido de elementos de lista en jQuery


101

Tengo una estructura como esta:

<ul>
  <li>text1</li>
  <li>text2</li>
  <li>text3</li>
</ul>

¿Cómo uso javascript o jQuery para obtener el texto como una matriz?

['text1', 'text2', 'text3']

Mi plan después de esto es ensamblarlo en una cadena, probablemente usando .join(', '), y obtenerlo en un formato como este:

'"text1", "text2", "text3"'

Respuestas:


141
var optionTexts = [];
$("ul li").each(function() { optionTexts.push($(this).text()) });

... debería hacer el truco. Para obtener el resultado final que está buscando, join()más un poco de concatenación funcionará bien:

var quotedCSV = '"' + optionTexts.join('", "') + '"';

2
¿JQuery garantiza un orden a los elementos devueltos por la consulta? Asumiría que el orden devuelto es el mismo que el orden en el DOM (es decir, texto1, texto2, texto3), pero no sé qué buscar en la documentación para ver si esto es cierto.
styfle

2
Nunca lo he visto atravesar el DOM de otra manera que el orden de lectura normal. Entonces, aunque no puedo probarlo, apostaría la granja a que siempre atraviesa el DOM de arriba a abajo :)
Flater

¿No se considera que $ .each tiene un mal desempeño? Si es así, ¿hay alguna otra forma de hacerlo?
Daniel

¿Cuántos elementos de la lista tienes para que esto sea un problema, @Daniel? Sí, hay otras formas de hacer lo mismo (podría usar $ .map () para generar la matriz de una vez), pero equivalen a lo mismo.
Shog9

@ Shog9: Deseo enviar un diccionario a la lista tomando valores de dos columnas diferentes de cada fila de una tabla. ¿No hay una manera más fácil de hacer eso? Gracias por adelantado.
ln2khanal

71

Sin matrices intermedias redundantes:

arr = $('li').map(function(i,el) {
    return $(el).text();
}).get();

Ver demostración de jsfiddle


6
Echas de menos .get()al final.
Felix Kling

4
Basado en la sugerencia de Felix Klings: arr = $ ('li'). Map (function () {return $ (this) .text ();}). Get ();
Emil Stenström

1
No entiendo por qué es necesario "obtener función".
crsuarezf

1
api.jquery.com/map explica por qué es necesario un .get () ("Como el valor de retorno es una matriz envuelta en jQuery, es muy común obtener () el objeto devuelto para trabajar con una matriz básica").
Kitto

3
Lo peor es que el iterador está mal, necesita cambiar el elemento y el índice, para que diga función (i, el).
Kitto

14

Y en javascript limpio:

var texts = [], lis = document.getElementsByTagName("li");
for(var i=0, im=lis.length; im>i; i++)
  texts.push(lis[i].firstChild.nodeValue);

alert(texts);

14

kimstik estaba cerca, pero no del todo.

A continuación, le indicamos cómo hacerlo en un conveniente resumen:

$.map( $('li'), function (element) { return $(element).text() });

Aquí está la documentación completa para la función de mapa de jQuery, es bastante útil: http://api.jquery.com/jQuery.map/

Solo para responder completamente, aquí está la funcionalidad completa que estaba buscando:

$.map( $('li'), function (element) { return $(element).text() }).join(', ');

Acabo de ver esto aquí ( stackoverflow.com/questions/4856283/… ) e iba a volver a publicar, ya que es un gran truco para saberlo
SeanDowney

Mi camino debería ser un poco más rápido ... ¿o no?
kimstik

1
kimstik, según Benchmark.js, mi llamada de función hace 11,252 / 9,685 operaciones / seg para Opera y Chrome respectivamente, mientras que la llamada al método que publicaste hace 9,666 / 9,083 operaciones / seg en una lista de 40 elementos. Creo que la diferencia proviene de la conversión de la lista de elementos de jQuery a Array en su ejemplo, si eso ayuda. Están muy cerca, así que elija el que mejor se adapte a su estilo de codificación :)
Cybolic

6
var arr = new Array();

$('li').each(function() { 
  arr.push(this.innerHTML); 
})

1
En lugar de confiar en innerHTML, debe cambiar "this" a un objeto jQuery y usar el método de texto nativo jQuery. $ (this) .text ()
Nathan Strutz

3
¿por qué? eventualmente $ (this) .html () usará el método nativo
Khodor

En este caso, es mejor usar [] en lugar del nuevo Array () - ¿Cuál es la diferencia?
krypru

2

Puede hacer lo siguiente. una línea de código será suficiente

  • let array = $('ul>li').toArray().map(item => $(item).html());
  • Obtener el elemento interesado

    1. conseguir niños

    2. obtener la matriz del método toArray ()

    3. filtra los resultados que deseas

let array = $('ul>li').toArray().map(item => $(item).html());
console.log(array);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<ul>
  <li>text1</li>
  <li>text2</li>
  <li>text3</li>
</ul>

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.