2012-02-20 22 views
37

tengo un plugin jQuery estándar establecido que crea la configuración predeterminada en la parte superior:Javascript: iterar sobre objetos Valores literales

jQuery.fn.myPlugin = function(options) { 
    var defaults = { 
     starts: "0px,0px", 
     speed: 250, ... 
    }; 
    o = $.extend(defaults, options); 
} 

tengo otra variable llamada numberOfObjects.

Estoy intentando recorrer las variables predeterminadas. Para cada objeto encontrado (de numberOfObjects) necesito duplicar el valor del valor de la variable. Entonces, si la variable numberOfObjects es 3, la defaults.starts debe ser 0px,0px > 0px,0px > 0px,0px. El > se usa para dividir valores.

Esto es lo que tengo actualmente. X representa el nombre de la variable dentro de los valores predeterminados. Y representa la variable para el valor actual de x. He llegado tan lejos y no tengo ni idea de qué hacer a continuación.

for (x in defaults) { // x is defaults.x 
    defaults.x = defaults.x + " > y"; 
} 

Respuesta

72
var obj = { 
    'foo': 1, 
    'bar': 2 
}; 

for (var key in obj) { 
    console.log(obj[key]); 
} 

O con jQuery:

$.each(obj, function(key, value) { 
    console.log(this, value, obj[key]); 
}); 
+0

Excelente! Esto funcionó a la perfección! Gracias :) – Aaron

+5

El problema con este método es que también debe verificar si la propiedad pertenece al objeto en sí mismo en lugar de su prototipo. Sugiero usar la solución @ blair-anderson con 'Object.keys (obj)' – ivstas

+1

@Kite mientras que es verdadero, la pregunta específicamente sobre 'object literals ' – Petah

3

En su código:

for(x in defaults){ 
    defaults.x = defaults.x + " > y"; 
} 

que necesita decir defaults[x] en lugar de defaults.x.

x es una variable que contiene una cadena que es la clave en el objeto defaults, y la sintaxis de paréntesis (estilo de matriz) le permite usar esa variable para obtener la propiedad. Con la notación de puntos defaults.x está buscando una propiedad realmente llamada "x", el equivalente a defaults["x"].

+0

Ok, estoy confundido. Si inicio sesión en console.log (defaults [starts]) no obtengo absolutamente nada, pero si inicio sesión en console.log (defaults.starts), saco la cadena. La x es solo una variable independiente que necesito para asignar 'inicios', 'velocidad', etc. dentro del ciclo a través de los valores predeterminados, así obtengo los valores predeterminados. Inicios y valores predeterminados. Velocidad, etc. ¿Estoy configurando los valores predeterminados? sección incorrectamente? ¡Gracias! – Aaron

+0

La notación de puntos funciona con el nombre real de la propiedad, por lo que en su ejemplo 'defaults.starts' funciona porque tiene un nombre de propiedad que es la cadena" starts ". La notación de corchetes equivalentes es 'default [" starts "]' - note las comillas. El bit dentro de los corchetes debe ser cualquier expresión JS que devuelva una cadena, por lo que si dices 'defaults [starts]' está buscando una variable 'starts', que no tienes, por lo que devuelve indefinido. Lea esto: https://developer.mozilla.org/en/JavaScript/Guide/Working_with_Objects – nnnnnn

32

No debe tener que depender de jQuery para esto.

Object.keys(obj).forEach(function (key) { 
    var value = obj[key]; 
    // do something with key or value 
}); 
+0

También vaya al enlace para el polyfill si necesita soportar IE menos de 9. – Greg

+1

De acuerdo con la guía de estilo de AirBnB con ESLint, esta es la forma preferida sobre 'for (var key in obj)' – Timo

5

mejor práctica es para validar si el atributo de objeto que se itera sobre es del objeto en sí mismo y norte ot heredado de la cadena del prototipo. Puede verificar esto usando .hasOwnProperty(): (Por supuesto, si desea incluir propiedades heredadas, simplemente elimine la instrucción if).

Aquí es el caso general:

for(var index in object) { 
    if (object.hasOwnProperty(index)) { 
     var value = object[index]; 
     // do something with object value here. 
    } 
} 

Aquí es el caso del ejemplo que usted ha mencionado en la que desea crear un objeto duplicado con el valor de cada llave duplicada replicado de acuerdo con el valor de la variable numberofobjects (i 'he añadido en dos soluciones mediante el cual se modifica el objeto, ya sea existente o crear uno nuevo):

// function to repeat value as a string inspired by disfated's answer here http://stackoverflow.com/questions/202605/repeat-string-javascript 

function repeatValue(value, count) { 
    value = String(value); // change to string to be able to add " > " as in question 
    if (count < 1) return ''; 
    var result = ''; 
    while (count > 1) { 
     if (count & 1) result += value + " > "; 
     count >>= 1, value += " > " + value; 
    } 
    return result + value; 
} 

var numberofobjects = 3; 
var newObject = {}; // for use if creating a duplicate object with the new values 

for(var x in defaults) { 
    if (defaults.hasOwnProperty(x)) { 
     //use this to replace existing values 
     defaults[x] = repeatValue(defaults[x], numberofobjects); 

     //or use this to create values in the new object 
     newObject[x] = repeatValue(defaults[x], numberofobjects); 
    } 
} 
3

configuración de dejar que nuestro objeto básico antes de empezar:

const x = { 
    x: 1, 
    y: 2, 
    z: 3 
}; 

Podemos utilizar Object.keys (x) para devolver una matriz de todas las claves dentro de nuestro objeto.

Object.keys(x) 
> ['x', 'y', 'z'] 

Ahora capaces de cartografiar, filtro, reducir y lazo sobre nuestra matriz y hacer algo con ese valor dentro de nuestro objetivo:

Object.keys(x).map(key => x[key] + 1) 
> [2,3,4] 

Object.keys(x).forEach(key => console.log(x[key])) 
> [1,2,3] 

La principal quitamos aquí es que tenemos que utilizar el clave para acceder a ese valor específico, funciona, pero se siente un poco torpe. ES2017 trae consigo Object.values() que se puede utilizar como un buen atajo para devolver una matriz de todos los valores dentro de un Object.

Object.values(x) 
> [1,2,3] 

Object.values(x).map(value => value + 1) 
> [2,3,4] 

Object.values(x).forEach(value => console.log(value)) 
> [1,2,3] 

Puede leer más sobre Object.values ​​() en MDN, también se incluye un polyfill, en caso de que tenga que soportar los navegadores antiguos & navegadores que aún no lo han implementado.

+1

Esta es la solución más completa. ¡Gracias! –

0

var yourVariable = { 
 
    Bobe: 23, 
 
    Pope: 33, 
 
    Doop: 43, 
 
    Dope: 53 
 
}; 
 

 
for(var keyName in yourVariable){ 
 
document.write(keyName, " : ",yourVariable[keyName]," "); 
 
};