entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

Bucle para acceder a un objeto.

Hola amigos, esta es una curiosidad para conocer mejor Javascript. Tengo el siguiente programa:

var elem = [$moshier.body.sun,$moshier.body.moon,$moshier.body.mercury,
$moshier.body.venus,$moshier.body.mars,$moshier.body.jupiter,
$moshier.body.saturn,$moshier.body.uranus,$moshier.body.neptune,
$moshier.body.pluto];   
var longi = new Array();
for (var ky in elem){
    $processor.calc (date, elem[ky]); 
    longi[ky] = elem[ky].position.apparentLongitude;        
}

¿Se podría acceder mediante un bucle a todos los objetos que vemos en el array, sin necesidad de dicho array, conociendo sólo $moshier.body ?
Muchas gracias por vuestra respuesta. :-)

0voto

Leonardo-Tadei comentado

Tendríamos que ver la definición de $moshier.body y ver la estructura para responder a esto.
Ahora estás recorriendo elem, que es un vector de varios $moshier.body concretos: sun, moon, etc.
Dependerá sobre todo de qué tipo es la estructura de body para saber si se puede recorrer o no...

0voto

oraculus comentado

Muchas gracias Leonardo.
body es el archivo body.js en el que se dan propiedades a los objetos:

$ns.body = {
/**
 * Planets
 */
mercury: {
    epoch: 2446800.5, // 05.01.1987
    inclination: 7.0048,
    node: 48.177,
    perihelion: 29.074,
    semiAxis: 0.387098,
    dailyMotion: 4.09236,
    eccentricity: 0.205628,
    anomaly: 198.7199,
    equinox: {julian: 2446800.5},
    magnitude: -0.42,
    semiDiameter: 3.36
},

(...)

2 Respuestas

2votos

white Puntos75820

eso depende de que contenga $ns.body, suponiendo que contiene solo lo del array, entonces el array elem es innecesario, caso contrario habria mas opciones para extraer lo importante de $ns.body, pero creo que el usuario es quien define que recorrer.

extrayendo "mercury, venus, moon":

var elements = ['mercury', 'venus', 'moon'];

for(var x in elements)
{
    var star = $ns.body[elements[x]];

    console.log(star);
}

se me ocurre otra opcion, tambien existe la posibilidad de filtrar un objeto en javascript, para ello necesitarias una funcion, algo similar a Array.filter() de esta forma podrias filtrar $ns.body y obtener elementos que por ejemplo tengan magnitude entre -0.2 y 1 u otro filtro cualquiera.

Ejemplo:

$ns.body.filter = function(compFunc)
{
    if(typeof compFunc !== 'function')
        return this;

    var newObject = {};

    Object.keys(this).forEach(function (k) {

        if(k !== 'filter') {
            if(compFunc.call(this, k, $ns.body[k])){
                newObject[k] = $ns.body[k];
            }
        }
    });

    return newObject;
}

var myObject = $ns.body.filter(function(k, v){
    return (v.magnitude > -0.2 && v.magnitude < 1)
});

// objetos que empiezen con "m"
var myObject2 = $ns.body.filter(function(k, v){
    return (k.charAt(0) == 'm');
});

console.log(myObject);
console.log(myObject2);

0voto

oraculus comentado

Muchas gracias white. Estoy aprendiendo técnicas interesantes de javascript gracias a tu respuesta.
Mi pregunta iba por el lado de saber si existe una manera de conocer los elementos de body en el caso de que no supiéramos que son 'sun, moon, mercury,' etc.

0voto

white comentado

usando el mismo metodo que puse arriba,

//Nota, Object.keys compatibilidad: ECMAScript >= 5
console.log(Object.keys($ns.body));
// si deseas recorrerlo..
//Object.keys($ns.body).forEach(function (k){ console.log($ns.body[k]) });

2votos

Leonardo-Tadei Puntos227010

Hola Oraculus,

podrías recorrer la estructura sin conocer a priori ningún elemento con una función rescursiva. Te dejo un ejemplo que define de forma ligeramente diferente NS, ya que ese código me daba un error:

var ns = { body : {
mercury: {
    epoch: 2446800.5, // 05.01.1987
    inclination: 7.0048,
    node: 48.177,
    perihelion: 29.074,
    semiAxis: 0.387098,
    dailyMotion: 4.09236,
    eccentricity: 0.205628,
    anomaly: 198.7199,
    equinox: {julian: 2446800.5},
    magnitude: -0.42,
    semiDiameter: 3.36
},
earht: {
    epoch: 0, // 0
    inclination: 1.0048,
    node: 8.177,
    perihelion: 9.074,
    semiAxis: 0.1387098,
    dailyMotion: 1,
    eccentricity: 0.005628,
    anomaly: 98.7199,
    equinox: {julian: 2446800.5},
    magnitude: 0,
    semiDiameter: 1
}}};

function showProps(obj, objName) {
  var result = "";
  for (var i in obj) {
    if (obj.hasOwnProperty(i)) {
        result += objName + "." + i + " = " + obj[i] + "\n";
    }
    if(typeof obj[i] == 'object'){
        result += showProps(obj[i], i);
    }
  }
  return result;
}

res = showProps(ns, "ns");
console.log(res);

Podés usar la misma función apuntando directamente a un elemento conocido:

 res = showProps(ns.body.mercury, "ns.body.mercury");
console.log(res);

Saludos cordiales.

PD: el segundo parámetro en realidad no hace falta, pero ayuda a ver la salida

0voto

oraculus comentado

Exacto Leonardo. Era eso lo que quería saber.
Edito: No había visto tu respuesta white. También funciona.
Muchas gracias :-)

0voto

Leonardo-Tadei comentado

Por nada @oraculus!
Saludos cordiales

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta