2011-10-05 21 views
5

Estoy usando un objeto como una tabla hash. Me gustaría imprimir rápidamente su contenido (por ejemplo, alert()). ¿Hay algo incorporado para convertir un hash en matrices de pares (clave, valor)?¿Acoplar objeto a la matriz?

+0

¿Qué pasa con 'console.log' o' console.dir'? – jAndy

+0

¿Qué pasa con la consola.Iniciar sesión()? ¿Por qué alerta? Nunca muestra suficiente información de depuración. Las consolas de navegadores más nuevos deben mostrar suficiente información si console.log su variable. Además, las matrices JS son objetos ... o, si se quiere, los objetos son matrices asociativas. –

+0

@ N.B .: JS 'Array's son' Object's; y JS 'Object's modelan el concepto de" arrays asociativos ", pero" arrays asociativos "y" Array "son nociones distintas. No confundamos! La terminología del OP es acertada. –

Respuesta

2

he actualizado esta un poco más. Esto es mucho más fácil de analizar que incluso console.log porque deja fuera el material adicional que está allí como __proto__.

function flatten(obj) { 
    var empty = true; 
    if (obj instanceof Array) { 
     str = '['; 
     empty = true; 
     for (var i=0;i<obj.length;i++) { 
      empty = false; 
      str += flatten(obj[i])+', '; 
     } 
     return (empty?str:str.slice(0,-2))+']'; 
    } else if (obj instanceof Object) { 
     str = '{'; 
     empty = true; 
     for (i in obj) { 
      empty = false; 
      str += i+'->'+flatten(obj[i])+', '; 
     } 
     return (empty?str:str.slice(0,-2))+'}'; 
    } else { 
     return obj; // not an obj, don't stringify me 
    } 
} 

Lo único que haría para mejorar esto es que tenga una sangría correcta en función del nivel de recursión.

+0

¿Por qué elegirías esto en 'console.log'? ¿Por qué está evitando las fantásticas opciones de depuración que su navegador ofrece para usted? –

+2

¿Quién dijo que alguien estaba evitando 'console.log'? La pregunta era cómo aplanar los datos. 'alert()' solo se mencionó "por ejemplo". ¿Qué sucede si quiere enviarlo de vuelta a un servidor a través de Ajax para que se registre allí? –

+0

Conozco 'console.log' y ciertamente es genial para la mayoría de mis necesidades de depuración. Sin embargo, a veces me resulta útil usar la alerta para saber exactamente cuándo sucede algo. El código que viene directamente después de una alerta no se ejecuta hasta que no acepte la alerta. En general, cuando no se desea este comportamiento, hay pocas razones para usar 'alert()'. –

0

Utilice el bucle for:

for (var x in yourObj) 
{ 
    alert(yourObj[x]); 
} 
+0

de esa manera solo verías los valores. Bute incluso si concentreas las teclas también, alertaría muchas veces probablemente. Debe crear una cadena y alertar el resultado final. – jAndy

+0

Bueno, esto es solo un ejemplo del bucle for, no una implementación completa de lo que quiere el operador. él debería poder descifrar el resto. – m0sa

1

No que yo sepa. Aún así, puede hacerlo por sí solo bastante concisa:

var obj = { a: 1, b: 2, c: 3 }; 
var arr = []; 
for (var i in obj) { 
    var e = {}; 
    e[i] = obj[i]; 
    arr.push(e); 
} 
console.log(arr); 
// Output: [Object { a=1 }, Object { b=2 }, Object { c=3 }] 

Por supuesto, no se puede alert esto tampoco, así que puede ser que también acaba de console.log(obj) en el primer lugar.


Usted podía matrices de salida de matrices:

var obj = { a: 1, b: 2, c: 3 }; 
var arr = []; 
for (var i in obj) { 
    arr.push([i, obj[i]]); 
} 
console.log(arr); 
// Output: [["a", 1], ["b", 2], ["c", 3]] 

alert(arr); 
// Alert: a, 1, b, 2, c, 3 

Pero, de nuevo, ew.

6

Como desea alert a cabo Supongo que no es para su versión de producción, y que la compatibilidad del navegador anterior no es un problema.

Si este es el caso, entonces usted puede hacer esto:

var myHash = ...... 
alert(Object.keys(myHash).map(function(key) { return [key, myHash[key]]; })); 
+0

Esto es bastante dulce. –

+0

Oh, sí lo es: 'myUsers var = {};' ' myUsers [0] = { 'id': 'nombre de usuario' 'x': 'AAA'} \ N' ' myUsers [1 ] = {'id': 'y', 'username': 'bbb'} ' ' Object.keys (myUsers) .map (function (key) {return myUsers [key] .username;}) ' Gracias ! – dirkk0

1

para una rápida & uso sucia en alert podría utilizar JSON:

alert(JSON.stringify(yourObj).replace(/,/g,'\n')); 
1

aquí está mi versión de la misma. Se le debería permitir a aplanar la entrada como a continuación:

var input = { 
    a: 'asdf', 
    b: [1,2,3], 
    c: [[1,2],[3,4]], 
    d: {subA: [1,2]} 
} 

La función es la siguiente:

function flatten (input, output) { 

     if (isArray(input)) { 
     for(var index = 0, length = input.length; index < length; index++){ 
      flatten(input[index], output); 
     } 
     } 
     else if (isObject(input)) { 
     for(var item in input){ 
      if(input.hasOwnProperty(item)){ 
      flatten(input[item], output); 
      } 
     } 
     } 
     else { 
     return output.push(input); 
     } 
    }; 

    function isArray(obj) { 
     return Array.isArray(obj) || obj.toString() === '[object Array]'; 
    } 

    function isObject(obj) { 
     return obj === Object(obj); 
    } 

uso es algo así como:

salida var = []

aplanar (de entrada y salida);

Luego, la salida debe ser la matriz aplanada.

0

Tal vez un poco tarde, pero aquí tienes mi versión de la respuesta, actualizada a ES2015. Yo uso una función recursiva y funciona incluso si hay otros objetos en el interior del objeto principal:

function objectFlattener (object) { 
    return Reflect.apply(Array.prototype.concat, [], Object.keys(object).map(key => { 
    if (object[key] instanceof Object) { 
     return objectFlattener(object[key]); 
    } 
    return `${ key }: ${ object[key] }`; 
    })); 
} 

Así que el cambio de la última declaración puede dar formato al elemento dentro de la matriz.

Cuestiones relacionadas