Documente Academic
Documente Profesional
Documente Cultură
Ir a la navegaciónIr a la búsqueda
Las referencias de este artículo no tienen un formato correcto. Puedes
colaborar editándolas como se indica en esta página.
También puedes avisar en su página de discusión a quien las
añadió pegando: {{subst:Aviso formato de
referencias|MongoDB}} ~~~~ Este aviso fue puesto el 16 de diciembre de 2014.
MongoDB
http://www.mongodb.org/
Información general
Programado en C++
Índice
1Historia
2Concesión de licencias y soporte
3Características principales
o 3.1Consultas Ad hoc
o 3.2Indexación
o 3.3Replicación
o 3.4Balanceo de carga
o 3.5Almacenamiento de archivos
o 3.6Agregación
o 3.7Ejecución de JavaScript del lado del servidor
4Fragmentación (Sharding)
5Principales problemas
o 5.1No implementa las propiedades ACID multidocumento
o 5.2Problemas de consistencia
o 5.3Bloqueo a nivel de documento
o 5.4Las escrituras no son durables ni verificables
o 5.5Problemas de escalabilidad
6Casos de uso
7Manipulación de datos: colecciones y documentos
8Lenguajes de programación soportados
9Instrumentos de MongoDB
10Referencias
11Bibliografía
12Enlaces externos
Historia[editar]
El desarrollo de MongoDB empezó con la empresa de software 10gen Inc. (ahora llamada
MongoDB Inc.)1 en 2007 cuando estaban desarrollando una plataforma como
servicio (PaaS) similar al conocido Google App Engine.6 En 2009 MongoDB fue lanzado
como un producto independiente y publicado bajo la licencia de código abierto AGPL.7
En marzo de 2011, se lanzó la versión 1.4 y se consideró ya como una base de datos lista
para su uso en producción.8
Concesión de licencias y soporte[editar]
MongoDB se puede obtener de una forma gratuita bajo la licencia pública general de
Affero (AGPL) de GNU.7 Los drivers para los lenguajes de programaciónestán bajo
la licencia de Apache. Adicional a estas licencias, MongoDB Inc. ofrece una licencia
comercial para MongoDB que incluye características avanzadas (como integración
con SASL, LDAP, Kerberos,9 Simple Network Management Protocol10 y búsqueda de texto
de Rosette Linguistics Platform de Basis Technology11), herramientas de gestión,
monitorización y backup, así como soporte.12
Características principales[editar]
Lo siguiente es una breve descripción de las características principales de MongoDB:
Consultas Ad hoc[editar]
MongoDB soporta la búsqueda por campos, consultas de rangos y expresiones regulares.
Las consultas pueden devolver un campo específico del documento pero también puede
ser una función JavaScript definida por el usuario.
Indexación[editar]
Cualquier campo en un documento de MongoDB puede ser indexado, al igual que es
posible hacer índices secundarios. El concepto de índices en MongoDB es similar a los
encontrados en base de datos relacionales..
Replicación[editar]
MongoDB soporta el tipo de replicación primario-secundario. Cada grupo de primario y sus
secundarios se denomina replica set.13 El primario puede ejecutar comandos de lectura y
escritura. Los secundarios replican los datos del primario y sólo se pueden usar para
lectura o para copia de seguridad, pero no se pueden realizar escrituras. Los secundarios
tienen la habilidad de poder elegir un nuevo primario en caso de que el primario actual deje
de responder.
Balanceo de carga[editar]
MongoDB se puede escalar de forma horizontal usando el concepto de “shard”.14 El
desarrollador elige una clave de sharding, la cual determina cómo serán distribuidos los
datos de una colección. Los datos son divididos en rangos (basado en la clave de
sharding) y distribuidos a través de múltiples shard. Cada shard puede ser una réplica set.
MongoDB tiene la capacidad de ejecutarse en múltiple servidores, balanceando la carga
y/o replicando los datos para poder mantener el sistema funcionando en caso que exista
un fallo de hardware. La configuración automática es fácil de implementar bajo MongoDB y
se pueden agregar nuevas servidores a MongoDB con el sistema de base de datos
funcionando.
Almacenamiento de archivos[editar]
MongoDB puede ser utilizado como un sistema de archivos, tomando la ventaja de la
capacidad que tiene MongoDB para el balanceo de carga y la replicación de datos
utilizando múltiples servidores para el almacenamiento de archivos. Esta función se llama
GridFS15 y es más bien una implementación en los drivers, no en el servidor,16 por lo que
está incluida en los drivers oficiales que la compañía de MongoDB desarrolla. Estos drivers
exponen funciones y métodos para la manipulación de archivos y contenido a los
desarrolladores. En un sistema con múltiple servidores, los archivos pueden ser
distribuidos y replicados entre los mismos y de una forma transparente, de esta forma se
crea un sistema eficiente que maneja fallos y balanceo de carga.
Agregación[editar]
MongoDB proporciona un framework de agregación que permite realizar operaciones
similares a las que se obtienen con el comando SQL "GROUP BY". El framework de
agregación está construido como un pipeline en el que los datos van pasando a través de
diferentes etapas en los cuales estos datos son modificados, agregados, filtrados y
formateados hasta obtener el resultado deseado. Todo este procesado es capaz de utilizar
índices si existieran y se produce en memoria. Asimismo, MongoDB proporciona una
función MapReduce que puede ser utilizada para el procesamiento por lotes de datos y
operaciones de agregación.
Ejecución de JavaScript del lado del servidor[editar]
MongoDB tiene la capacidad de realizar consultas utilizando JavaScript, haciendo que
estas sean enviadas directamente a la base de datos para ser ejecutadas.
Fragmentación (Sharding)[editar]
Si estás desarrollando un servicio que se va haciendo popular o los niveles de acceso a
base de datos son cada vez más altos, empezarás a notar que tu base de datos está
siendo atacada por un tráfico creciente y tu servidor esté sufriendo por los altos niveles de
stress y te podrías ver en la necesidad de actualizar tu infraestructura para soportar la
demanda.
Aquí entra en juego el sharding, es el modo en el que hacemos nuestra base de datos
escalable. En lugar de tener una colección en una base de datos, la pondríamos en varias
bases de datos distribuidas, de modo que a la hora de consultar los datos de dicha
colección, los recuperemos como si de una única base de datos se tratase. Mongo se
encargará de averiguar de manera transparente en qué base de datos se encuentran los
datos.
Los fragmentos estarán formados por replica set, de modo que si creamos tres
fragmentos, cada uno de los cuales tiene una replica set con tres servidores, estaríamos
hablando de un total de nueve servidores.
Si hacemos consultas, estas se realizarán de manera distribuida a través de un módulo
enrutador llamado “MongoS” que mantendrá un pequeño pool de conexiones a los
distintos host. Para conocer en qué fragmento debe consultar para recuperar datos de una
colección ordenada, se utilizan rangos y shard_key, de modo que se trocea la colección en
rangos y les asigna un id (shard_key), que puede ser una parte del propio documento, y se
distribuye en los fragmentos (replica set). De modo que cuando se consulte la colección
debemos proporcionar el “shard_key”.
Principales problemas[editar]
No implementa las propiedades ACID multidocumento[editar]
MongoDB garantiza ACID dentro del mismo documento. El no implementar las
propiedades ACID genera que la base de datos no asegure la durabilidad, la integridad, la
consistencia y el aislamiento requeridos obligatoriamente en las transacciones. Es posible
que en futuras versiones esto se solucione.
Sobre la base de este punto se detallan los cuatro siguientes:
Problemas de consistencia[editar]
En versiones anteriores de la base de datos las lecturas estrictamente consistentes ven
versiones obsoletas de documentos, también pueden devolver datos incorrectos de
lecturas que nunca deberían haber ocurrido.17
Este problema se considera solucionado a partir de la versión
3.4: https://jepsen.io/analyses/mongodb-3-4-0-rc3
Bloqueo a nivel de documento[editar]
MongoDB bloquea la base de datos a nivel de documento ante cada operación de
escritura. Sólo se podrán hacer operaciones de escritura concurrentes entre distintos
documentos.
Las escrituras no son durables ni verificables[editar]
MongoDB retorna cuando todavía no se ha escrito la información en el espacio de
almacenamiento permanente, lo que puede ocasionar pérdidas de información. En
MongoDB 2.2 se cambia el valor por defecto para escribir en al menos una réplica, pero
esto sigue sin satisfacer la durabilidad ni la verificabilidad.18
Problemas de escalabilidad[editar]
Tiene problemas de rendimiento cuando el volumen de datos supera los 100TB.19
Casos de uso[editar]
La base de datos MongoDB es adecuada para los siguientes usos:20
Votaciones
Registro de usuarios
Perfiles de usuarios
Sesiones de datos
etc.
{
"_id": ObjectId("4efa8d2b7d284dad101e4bc7"),
"Last Name": "PELLERIN",
"First Name": "Franck",
"Age": 29,
"Address": {
"Street": "1 chemin des Loges",
"City": "VERSAILLES"
}
}
En este ejemplo se puede ver que en el campo “Address” se contiene otro documento
que tiene los campos de “Street” y “City”.
C
C++
C# / .NET
Erlang
Haskell
J#
Java
JavaScript
Lisp
Node.js
Perl
PHP
Python
Ruby
Delphi
Scala
Instrumentos de MongoDB[editar]
Los siguientes comandos pueden ser instalados para el manejo y la administración del
sistema de base de datos:
+´´+´+´+´+´+´+
Node.js
Ir a la navegaciónIr a la búsqueda
Node.js
nodejs.org
Información general
Versiones
lista versiones
Índice
1Ejemplos
2Aspectos técnicos
o 2.1Concurrencia
o 2.2V8
o 2.3Módulos
o 2.4Desarrollo homogéneo entre cliente y servidor
o 2.5Bucle de eventos
3Releases
4Comunidad
5Véase también
6Referencias
7Enlaces externos
Ejemplos[editar]
Versión de un hola mundo de un servidor HTTP escrito en Node.js:
Otro ejemplo con un servidor TCP que escucha en el puerto 7000 y responde con
cualquier cosa que se le envíe:
net.createServer(function (stream) {
stream.write('hello\r\n');
stream.on('end', function () {
stream.end('goodbye\r\n');
});
stream.pipe(stream);
}).listen(7000);
Aspectos técnicos[editar]
Concurrencia[editar]
Node.js funciona con un modelo de evaluación de un único hilo de ejecución, usando
entradas y salidas asíncronas las cuales pueden ejecutarse concurrentemente en un
número de hasta cientos de miles sin incurrir en costos asociados al cambio de contexto.8
Este diseño de compartir un único hilo de ejecución entre todas las solicitudes atiende a
necesidades de aplicaciones altamente concurrentes, en el que toda operación que realice
entradas y salidas debe tener una función callback. Un inconveniente de este enfoque de
único hilo de ejecución es que Node.js requiere de módulos adicionales como cluster9 para
escalar la aplicación con el número de núcleos de procesamiento de la máquina en la que
se ejecuta.
V8[editar]
V8 es el entorno de ejecución para JavaScript creado para Google Chrome. Es software
libre desde 2008, está escrito en C++ y compila el código fuente JavaScript en código de
máquina en lugar de interpretarlo en tiempo real.
Node.js contiene libuv para manejar eventos asíncronos. Libuv es una capa de abstracción
de funcionalidades de redes y sistemas de archivo en sistemas Windows y sistemas
basados en POSIX como Linux, Mac OS X y Unix.
El cuerpo de operaciones de base de Node.js está escrito en JavaScript con métodos de
soporte escritos en C++.
Módulos[editar]
Node.js incorpora varios "módulos básicos" compilados en el propio binario, como por
ejemplo el módulo de red, que proporciona una capa para programación de red asíncrona
y otros módulos fundamentales, como por ejemplo Path, FileSystem, Buffer, Timers y el de
propósito más general Stream. Es posible utilizar módulos desarrollados por terceros, ya
sea como archivos ".node" precompilados, o como archivos en javascript plano. Los
módulos Javascript se implementan siguiendo la especificación CommonJS para
módulos,10 utilizando una variable de exportación para dar a estos scripts acceso a
funciones y variables implementadas por los módulos.11
Los módulos de terceros pueden extender node.js o añadir un nivel de abstracción,
implementando varias utilidades middleware para utilizar en aplicaciones web, como por
ejemplo los frameworks connect y express. Pese a que los módulos pueden instalarse
como archivos simples, normalmente se instalan utilizando el Node Package Manager
(npm) que nos facilitará la compilación, instalación y actualización de módulos así como la
gestión de las dependencias. Además, los módulos que no se instalen el directorio por
defecto de módulos de Node necesitarán la utilización de una ruta relativa para poder
encontrarlos. El wiki Node.jsproporciona una lista de varios de los módulos de terceros
disponibles.
Desarrollo homogéneo entre cliente y servidor[editar]
Node.js puede ser combinado con una base de datos documental (por
ejemplo, MongoDB o CouchDB) y JSON lo que permite desarrollar en un entorno de
desarrollo JavaScript unificado. Con la adaptación de los patrones para desarrollo del lado
del servidor tales como MVC y sus variantes MVP, MVVM, etc. Node.js facilita
la reutilización de código del mismo modelo de interfaz entre el lado del cliente y el lado del
servidor.
Bucle de eventos[editar]
Node.js se registra con el sistema operativo y cada vez que un cliente establece una
conexión se ejecuta un callback. Dentro del entorno de ejecución de Node.js, cada
conexión recibe una pequeña asignación de espacio de memoria dinámico, sin tener que
crear un hilo de ejecución.12 A diferencia de otros servidores dirigidos por eventos, el bucle
de gestión de eventos de Node.js no es llamado explícitamente sino que se activa al final
de cada ejecución de una función callback. El bucle de gestión de eventos se termina
cuando ya no quedan eventos por atender.
Releases[editar]
Las nuevas releases major de Node.js se sacan de la rama master de GitHub cada seis
meses. Las versiones pares se sacan en abril, y las impares en octubre. Cuando se libera
una versión impar, la versión par anterior pasa a soporte a largo plazo (Long Term
Support, LTS), que da a la versión un soporte activo de 18 meses desde la fecha de inicio
de la LTS. Después de estos 18 meses, la versión recibe otros 12 meses de soporte de
mantenimiento. Una versión activa recibirá los cambios compatibles unas pocas semanas
después de que aterricen en la versión estable actual. Una versión de mantenimiendo
recibirá sólo actualizaciones críticas y de documentación.13
La estrategia y política de las versiones LTS se gestiona por el LTS Working Group en
colaboración con el Technical Steering Committee de Node.js Foundation.
2013-
v0.10.x Sin soporte - 2015-10-01 2016-10-31
03-11
2015-
v0.12.x Sin soporte - 2016-04-01 2016-12-31
02-06
2015- 2015-
4.x Argon Sin soporte 2017-04-01 2018-04-30
09-08 10-01
2015-
5.x No LTS N/D 2016-06-30
10-29
2016- 2016-
6.x Boron13 Mantenimiento 2018-04-30 Abril de 2019
04-26 10-18
2016-
7.x No LTS N/D 2017-06-30
10-25
2017-
9.x No LTS N/D 2018-06-30
10-01
2018- Octubre
10.x Dubnium13 Activo Abril de 2020 Abril de 2021
04-24 de 2018
2018-
11.x13 No LTS N/D Junio de 2019
10-23
2019- Octubre
12.x13 Pendiente Abril de 2021 Abril de 2022
04-23 de 2019
Comunidad[editar]
Existe una comunidad muy activa de desarrolladores de Node.js que se comunican a
través de grupos de discusión, nodejs y nodejs-dev y el canal IRC#node.js en freenode. La
comunidad se reúne en NodeConf, una convención de desarrolladores centrada en
Node.js.14
Véase también[editar]
JavaScript
V8
NPM, el gestor de paquetes para Node.js.
Entorno de desarrollo MEAN
Meteor (framework web)
´+´+´+´+´+
NoSQL
Ir a la navegaciónIr a la búsqueda
En informática, NoSQL (a veces llamado "no sólo SQL") es una amplia clase de sistemas
de gestión de bases de datos que difieren del modelo clásico de SGBDR (Sistema de
Gestión de Bases de Datos Relacionales) en aspectos importantes, siendo el más
destacado que no usan SQL como lenguaje principal de consultas. Los datos almacenados
no requieren estructuras fijas como tablas, normalmente no soportan operaciones JOIN, ni
garantizan completamente ACID(atomicidad, consistencia, aislamiento [isolated] y
durabilidad), y habitualmente escalan bien horizontalmente. Los sistemas NoSQL se
denominan a veces "no sólo SQL" para subrayar el hecho de que también pueden soportar
lenguajes de consulta de tipo SQL.
Por lo general, los investigadores académicos se refieren a este tipo de bases de datos
como almacenamiento estructurado, término que abarca también las bases de datos
relacionales clásicas. A menudo, las bases de datos NoSQL se clasifican según su forma
de almacenar los datos, y comprenden categorías como clave-valor, las implementaciones
de BigTable, bases de datos documentales, y bases de datos orientadas a grafos.
Los sistemas de bases de datos NoSQL crecieron con las principales redes sociales, como
Google, Amazon, Twitter y Facebook. Estas tenían que enfrentarse a desafíos con el
tratamiento de datos que las tradicionales SGBDR no solucionaban {ver articulo}. Con el
crecimiento de la web en tiempo real existía una necesidad de proporcionar información
procesada a partir de grandes volúmenes de datos que tenían unas estructuras
horizontales más o menos similares. Estas compañías se dieron cuenta de que el
rendimiento y sus propiedades de tiempo real eran más importantes que la coherencia, en
la que las bases de datos relacionales tradicionales dedicaban una gran cantidad de
tiempo de proceso[cita requerida].
En ese sentido, a menudo, las bases de datos NoSQL están altamente optimizadas para
las operaciones recuperar y agregar, y normalmente no ofrecen mucho más que la
funcionalidad de almacenar los registros (p.ej. almacenamiento clave-valor). La pérdida de
flexibilidad en tiempo de ejecución, comparado con los sistemas SQL clásicos, se ve
compensada por ganancias significativas en escalabilidad y rendimiento cuando se trata
con ciertos modelos de datos.[cita requerida]
Índice
1Historia del término
2Arquitectura
3Ventajas
4Desventajas
5Sistemas
o 5.1Tabla Comparativa de SGBD NoSQL
o 5.2Bases de datos documentales
o 5.3Bases de datos en grafo
o 5.4Bases de datos clave/valor
o 5.5Bases de datos multivalor
o 5.6Bases de datos orientadas a objetos
o 5.7Bases de datos tabular
o 5.8Bases de datos de arrays
6Referencias
7Enlaces externos
Arquitectura[editar]
Típicamente las bases de datos relacionales modernas han mostrado poca eficiencia en
determinadas aplicaciones que usan los datos de forma intensiva, incluyendo el indexado
de un gran número de documentos, la presentación de páginas en sitios que tienen gran
tráfico, y en sitios de streaming audiovisual. Las implementaciones típicas de SGBDR se
han afinado o bien para una cantidad pequeña pero frecuente de lecturas y escrituras o
para un gran conjunto de transacciones que tiene pocos accesos de escritura. Por otro
lado NoSQL puede servir gran cantidad de carga de lecturas y escrituras.
Implementaciones de NoSQL usadas en el mundo real incluyen los 3TB de los marcadores
verdes de Digg (indicados para señalar las historias votadas por otros en la red social;
aunque duró menos de 3 meses y fue abandonado); los 6 TB de la base de datos del
“ENSEMBLE” de la Comisión Europea usado en los modelos de comparación y calidad del
aire, y los 50 TB de la búsqueda de la bandeja de entrada de Facebook.
Las arquitecturas NoSQL frecuentemente aportan escasas garantías de consistencia, tales
como consistencia de eventos o transaccional restringida a ítems únicos de datos. Algunos
sistemas, sin embargo, aportan todas las garantías de los sistemas ACID en algunas
instancias añadiendo una capa intermedia (como por ejemplo, AppScale o CloudTPS). Hay
dos sistemas que han sido desplegados y que aportan aislamiento snapshot para
almacenamientos de columna: El sistema Percolator de Google (basado en el sistema
BigTable) y el sistema transaccional de Hbase desarrollado por la universidad de Waterloo.
Estos sistemas, desarrollados de forma independiente, usan conceptos similares para
conseguir transacciones ACID distribuidas de múltiples filas con garantías de aislamiento
snapshot para el sistema subyacente de almacenamiento en esa columna, sin sobrecarga
extra en la gestión de los datos, despliegue en el sistema de middleware, ni mantenimiento
introducido por la capa de middleware.
Bastantes sistemas NoSQL emplean una arquitectura distribuida, manteniendo los datos
de forma redundante en varios servidores, usando frecuentemente una tabla hash
distribuida. De esta forma, el sistema puede realmente escalar añadiendo más servidores,
y el fallo en un servidor puede ser tolerado.
Algunos defensores de NoSQL promueven interfaces simples tales como los arrays
asociativos o los pares clave-valor. Otros sistemas, tales como las bases de datos nativas
en XML, promueven el soporte del estándar Xquery. Los sistemas más novedosos tales
como CloudTPS también soportan unión de queries.
Ventajas[editar]
Estos sistemas responden a las necesidades de escalabilidad horizontal que tienen
cada vez más empresas.3
Pueden manejar enormes cantidades de datos.
No generan cuellos de botella.
Escalamiento sencillo.
Diferentes DBs NoSQL para diferentes proyectos.
Se ejecutan en clusters de máquinas baratas.
Desventajas[editar]
Existen desacuerdos sobre la neutralidad en el punto de vista de la versión
actual de este artículo o sección.
En la página de discusión puedes consultar el debate al respecto.
Las bases de datos NoSQL al ser de código abierto poseen un soporte diferente al
soporte que ofrecen las compañías comerciales a sus productos. Esto puede
presentar algunas ventajas y también algunas desventajas.
La falta de experiencia.- La novedad de NoSQL significa que no hay una gran cantidad
de desarrolladores y administradores que conocen la tecnología -lo que hace difícil a
las empresas encontrar personas con los conocimientos técnicos apropiados. Por el
contrario, el mundo SGBDR tiene miles de personas muy cualificadas.
Problemas de compatibilidad.- A diferencia de las bases de datos relacionales, que
comparten ciertos estándares, las bases de datos NoSQL tienen pocas normas en
común. Cada base de datos NoSQL tiene su propia API, las interfaces de consultas
son únicas y tienen peculiaridades. Esta falta de normas significa que es imposible
cambiar simplemente de un proveedor a otro, por si no quedara satisfecho con el
servicio.
Sistemas[editar]
Tabla Comparativa de SGBD NoSQL[editar]
Bases de datos documentales[editar]
Artículo principal: Base de datos documental
´+´+´+´+´+
Ask Question
1
Here is code that I have copied from w3schools, I have different code, but the problem that
I am having still happens in this simplified coding.
<!DOCTYPE html>
<html>
<body>
<p id="demo">Click the button to create an array, then display it's length</p>
<script>
function myFunction()
{
var fruits = ["Banana", "Orange", "Apple", "Mango"];
var foods = ["steak","pizza","bread","fruits"];
var x=document.getElementById("demo");
var y=foods[3];
x.innerHTML= y.length;
}
</script>
</body>
</html>
When I do x.innerHTML= fruits.length;, I get 4 back which is what I want to get.
But when I call
var y=foods[3];
x.innerHTML= y.length;
I get 6 which is the length of the word "fruits" but I want the length of the array fruits.
How do I do this?
I'm using jQuery, don't know if that affects anything. Do I have to add parenthesis or
brackets somewhere?
javascript jquery
Felix Kling
546k126849909
asked Jan 20 '13 at 20:11
Dropoff510
317
No, you don't have to add parenthesis, you just have to query fruits instead of foods. Unless
there's something I'm missing. – Mr Lister Jan 20 '13 at 20:13
2
Please! Don't use w3schools to teach you anything! – Joseph Silber Jan 20 '13 at 20:14
possible duplicate of Is there a way to access a javascript variable using a string that contains the name
of the variable? – Felix Kling Jan 20 '13 at 20:17
2
@JosephSilber Can you stop using w3fools as a reference, please. They are not. – Mr Lister Jan
20 '13 at 20:21
@FelixKling it's not a duplicate of that because the variable in this question is local, not
global. – Alnitak Jan 20 '13 at 20:22
show 4 more comments
5 Answers
activeoldest votes
In this case, your fruits array is just a normal local variable, so there's no way (short of the
frowned-upon eval function) to access it indirectly.
You can of course use fruits.length to directly find its length.
A better solution would be a nested object of foods, and not an array:
var foods = {
fruits: [ "Banana", "Orange", "Apple", "Mango" ],
steak: [ ... ],
pizza: [ ... ],
bread: [ ... ]
};
at which point you can use the syntax above and write:
Alnitak
269k62337429
downvoter, please explain – Alnitak Jan 20 '13 at 20:28
add a comment
2
Maybe what you want is
Gabriele Petrioli
149k23197253
this will work, but IMHO it's not a good solution. I'm pretty sure the OP wants to use
the string "fruits" to indirect into that array. – Alnitak Jan 20 '13 at 20:44
@Alnitak, i am sure using an object is the proper solution to such problems. My answer is a bit
directly based on the var y = foods[3]; part of the question.. – Gabriele Petrioli Jan 20 '13 at
20:47
add a comment
2
You seem to have a huge misunderstanding of the difference between the variable
identifier fruitsand the string "fruits".
Let's describe your code together so you understand well what you are doing.
Solution
EDIT: Check Altiniak's answer. I leave the rest of my post for the long and valid
explaination. The idea of using window was almost worse than using eval()...
shareimprove this answer
edited Jan 20 '13 at 20:41
answered Jan 20 '13 at 20:33
snooze92
3,55021828
1
fruits is not a global variable so window[foods[3]].length; will not work. The OP's code is
inside a function so nothing get store in the global scope.. – Gabriele Petrioli Jan 20 '13 at 20:35
+1 for effort, -2 for accuracy – Alnitak Jan 20 '13 at 20:37
My mistake. I will edit, but there is nothing to add to Alnitak's answer anymore ;) I would upvote
his if I could :P – snooze92 Jan 20 '13 at 20:39
@snooze92 downvote removed - you're neutral now ;-) Why can't you upvote? – Alnitak Jan 20
'13 at 20:42
@Alnitak I created my StackOverflow account 2h ago, still missing 6 "reputation points" until I
can upvote :) – snooze92 Jan 20 '13 at 20:44
show 4 more comments
1
In the following:
var y=foods[3];
x.innerHTML= y.length;"
You are assigning the 4th element in the foods array to the y variable, which is the string
"fruits". If you want the length of the array, just do this:
x.innerHTML = foods.length;
EDIT: I am assuming you just want the length of the foods array and NOT to store the
fruits array in the foods variable (if you need that, Gaby's answer can give you that)
shareimprove this answer
edited Jan 20 '13 at 20:21
answered Jan 20 '13 at 20:13
mattytommo
47.6k14101131
1
He actually wants to access the fruits array by using the foods array. – Amberlamps Jan 20 '13
at 20:15
@Amberlamps OP says "I get 6 which is the length of the word "fruit" but i want the length of the
array fruit." – mattytommo Jan 20 '13 at 20:16
2
@mattytommo: Exactly. foods[3] is the word fruits and he wants to access the variable with
that name. I had to read it a couple of times until I understood what the OP wants. – Felix
Kling Jan 20 '13 at 20:18
@mattytommo: I am pretty sure, that he wants what I described and also what Felix
said. – Amberlamps Jan 20 '13 at 20:19
The OP clearly wants to indirect from the string "fruits" into the local array of the same
name. – Alnitak Jan 20 '13 at 20:24
show 2 more comments
0
Hope I get what you want. You you have the word "fruits" and from that, you want to fetch
the contents of the var named fruits, right?
That can be done using eval.
var fruitlen = eval('fruits').length;
Is this what you wanted?
Mr Lister
34.5k1074115
eval is evil. :P – Christophe L Jan 20 '13 at 20:23
@ChristopheL Then let's hope this is not what the OP is asking for! Oh, and I like Alnitak's
answer. – Mr ListerJan 20 '13 at 20:25
+´+´+´+´
Length en Javascript
28 Feb 2011
Compartir en FacebookCompartir en TwitterCompartir en Google+
En Javascript, el comando length es uno de los más utilizados. Para todos los
desarrolladores, length es una de las piezas claves a la hora de recorrer arrays. Sin
embargo, además de como una propiedad, funciona también como un interesante
método aplicable a funciones que permite construir arquitecturas de objetos muy
flexibles. Repasemos todos sus usos con sus correspondientes ejemplos en cada caso:
Length En cadenas ( String )
El valor de la propiedad length en una cadena es igual a su número de caracteres.
Sin embargo, hay que tener en cuenta que el UTF-16, el formato para cadenas utilizado
en Javascript, utiliza una codificación de 16 bits para representar los caracteres más
usuales; en el caso de aquellos más raros, se necesitan dós unidades de código por lo
que puede darse el caso de que el valor length no se corresponda exactamente con el
número de caracteres utilizados en una cadena.
var foo = [ 1, 2, 3, 4, 5, 6, 7 ];
foo.length = 3;
console.log( foo ); // 1, 2, 3
Sin embargo, una vez truncado, ampliar la longitud del array no produce ningún
efecto:
foo.length = 6;
console.log( foo ); // 1, 2, 3
var foo = [ 1, 2, 3, 4, 5, 6 ];
En funciones ( Function )
En el caso de las funciones, length no es una propiedad sino un método. Invocado
directamente sobre el nombre de una función declarada, devuelve el número de
argumentos que espera:
console.log( foo.length ); // 3
Conociendo ambos datos, podemos crear una función que nos permita sobreescribir
métodos dependiendo de los valores que tengamos:
if ( fn.length == arguments.length ) {
Tomemos ahora un objeto con varios métodos de igual nombre que devolverán un valor
u otro dependiendo de los argumentos:
function Users(){
var users = [ 'Philip K Dick', 'Isaac Asimov', 'Philip J Farmer', 'Orso
// No arguments
addMethod( this, 'find', function(){
return users;
});
// One argument
addMethod( this, 'find', function( name ){
var retUsers = [];
for ( var i = 0; i < users.length; i++ ){
if( users[ i ].indexOf( name ) == 0 ){
retUsers.push( users[ i ] );
}
}
return retUsers;
});
// Two arguments
addMethod( this, 'find', function( first, last ){
var retUsers = [];
for( var i = 0; i < users.length; i++ ){
if(
( users[ i ].indexOf( first ) != -1 ) &&
( users[ i ].indexOf( last ) != -1) ){
retUsers.push( users[ i ] );
}
}
return retUsers;
});
}
var users = new Users();
En el ejemplo anterior, hemos creado tres métodos con el mismo nombre pero con un
comportamiento diferente basado en el número de argumentos. Esto ofrece una gran
flexibilidad a la hora de crear arquitecturas de objetos complejos que puede resultar
interesante de explotar.
Y hasta aquí este análisis sobre el comando length. Si tenéis más ejemplos de uso
interesantes, no dudéis en compartirlos en los comentarios!
Entradas relacionadas: