Existen los siguientes resultados de la consulta: (key1 y key2 podrían ser cualquier texto)
id key1 key2 value
1 fred apple 2
2 mary orange 10
3 fred banana 7
4 fred orange 4
5 sarah melon 5
...
y deseo almacenar los datos en una cuadrícula (tal vez como una matriz) repitiendo todos los registros como este:
apple orange banana melon
fred 2 4 7 -
mary - 10 - -
sarah - - - 5
En PHP esto sería realmente fácil, usando matrices asociativas:
$result['fred']['apple'] = 2;
Pero en matrices asociativas de JavaScript como esta no funciona. Después de leer toneladas de tutoriales, todo lo que pude obtener fue esto:
arr=[];
arr[1]['apple'] = 2;
pero arr['fred']['apple'] = 2;
no funciona. Probé matrices de objetos, pero las propiedades de los objetos no pueden ser texto libre. Cuanto más leía los tutoriales, más me confundía ...
Cualquier idea es bienvenida :)
var grid = {};grid['aa']['bb'] = 1;
devuelven "Uncaught TypeError: No se puede establecer la propiedad 'bb' de indefinido". Podría estar equivocado, pero con la mayoría de sus ejemplos tengo que conocer los datos en el momento de la inicialización.var grid = {}; grid['aa'] = {}; grid['aa']['bb'] = 1;
funciona. Una prueba más compleja falla, pero parece que estoy en el camino correctoRespuestas:
Simplemente use un objeto JavaScript normal, que se 'leería' de la misma manera que sus matrices asociativas. También debe recordar inicializarlos primero.
var obj = {}; obj['fred'] = {}; if('fred' in obj ){ } // can check for the presence of 'fred' if(obj.fred) { } // also checks for presence of 'fred' if(obj['fred']) { } // also checks for presence of 'fred' // The following statements would all work obj['fred']['apples'] = 1; obj.fred.apples = 1; obj['fred'].apples = 1; // or build or initialize the structure outright var obj = { fred: { apples: 1, oranges: 2 }, alice: { lemons: 1 } };
Si está examinando valores, es posible que tenga algo parecido a esto:
var people = ['fred', 'alice']; var fruit = ['apples', 'lemons']; var grid = {}; for(var i = 0; i < people.length; i++){ var name = people[i]; if(name in grid == false){ grid[name] = {}; // must initialize the sub-object, otherwise will get 'undefined' errors } for(var j = 0; j < fruit.length; j++){ var fruitName = fruit[j]; grid[name][fruitName] = 0; } }
fuente
grid[name] = {};
obj["fred.apples"]
por ejemploSi no tiene que ser una matriz, puede crear un objeto JS "multidimensional" ...
<script type="text/javascript"> var myObj = { fred: { apples: 2, oranges: 4, bananas: 7, melons: 0 }, mary: { apples: 0, oranges: 10, bananas: 0, melons: 0 }, sarah: { apples: 0, oranges: 0, bananas: 0, melons: 5 } } document.write( myObject[ 'fred' ][ 'apples' ] ); </script>
fuente
Javascript es flexible:
var arr = { "fred": {"apple": 2, "orange": 4}, "mary": {} //etc, etc }; alert(arr.fred.orange); alert(arr["fred"]["orange"]); for (key in arr.fred) alert(key + ": " + arr.fred[key]);
fuente
Como necesitaba obtener todos los elementos de una manera agradable, encontré este tema SO "Atravesando matriz / objeto asociativo bidimensional", sin importar el nombre para mí, porque la funcionalidad cuenta.
var imgs_pl = { 'offer': { 'img': 'wer-handwritter_03.png', 'left': 1, 'top': 2 }, 'portfolio': { 'img': 'wer-handwritter_10.png', 'left': 1, 'top': 2 }, 'special': { 'img': 'wer-handwritter_15.png', 'left': 1, 'top': 2 } }; for (key in imgs_pl) { console.log(key); for (subkey in imgs_pl[key]) { console.log(imgs_pl[key][subkey]); } }
fuente
Parece que para algunas aplicaciones, existe un enfoque mucho más simple para las matrices asociativas multidimensionales en javascript.
Dado que la representación interna de todas las matrices son en realidad objetos de objetos, se ha demostrado que el tiempo de acceso para elementos indexados numéricamente es en realidad el mismo que para los elementos indexados asociativos (texto).
el tiempo de acceso para elementos indexados asociativos de primer nivel no aumenta a medida que aumenta el número de elementos reales.
Dado esto, puede haber muchos casos en los que en realidad sea mejor utilizar un enfoque de cadena concatenada para crear la equivalencia de elementos multidimensionales. Por ejemplo:
store['fruit']['apples']['granny']['price] = 10 store['cereal']['natural']['oats']['quack'] = 20
va a:
store['fruit.apples.granny.price'] = 10 store['cereal.natural.oats.quack'] = 20
Las ventajas incluyen:
fuente
Obtenga el valor de la propiedad de una matriz de matrices asociativas cuando el nombre de la propiedad es un número entero:
Comenzando con una matriz asociativa donde los nombres de las propiedades son números enteros:
var categories = [ {"1":"Category 1"}, {"2":"Category 2"}, {"3":"Category 3"}, {"4":"Category 4"} ];
Empuje elementos a la matriz:
categories.push({"2300": "Category 2300"}); categories.push({"2301": "Category 2301"});
Recorra la matriz y haga algo con el valor de la propiedad.
for (var i = 0; i < categories.length; i++) { for (var categoryid in categories[i]) { var category = categories[i][categoryid]; // log progress to the console console.log(categoryid + " : " + category); // ... do something } }
La salida de la consola debería verse así:
1 : Category 1 2 : Category 2 3 : Category 3 4 : Category 4 2300 : Category 2300 2301 : Category 2301
Como puede ver, puede evitar la limitación de la matriz asociativa y hacer que el nombre de una propiedad sea un número entero.
NOTA: La matriz asociativa en mi ejemplo es el json que tendría si serializara un objeto Dictionary [].
fuente
No use una matriz, use un objeto.
var foo = new Object();
fuente
new Object()
, ya que el Object.prototype podría tener una rareza adjunta; use el objeto literal:var foo = {};
new Array()
que debería evitarse. ugh.No es necesario utilizar objetos necesariamente, puede hacerlo con matrices multidimensionales normales.
Esta es mi solución sin objetos :
// Javascript const matrix = []; matrix.key1 = [ 'value1', 'value2', ]; matrix.key2 = [ 'value3', ];
que en PHP es equivalente a:
// PHP $matrix = [ "key1" => [ 'value1', 'value2', ], "key2" => [ 'value3', ] ];
fuente
<script language="javascript"> // Set values to variable var sectionName = "TestSection"; var fileMap = "fileMapData"; var fileId = "foobar"; var fileValue= "foobar.png"; var fileId2 = "barfoo"; var fileValue2= "barfoo.jpg"; // Create top-level image object var images = {}; // Create second-level object in images object with // the name of sectionName value images[sectionName] = {}; // Create a third level object var fileMapObj = {}; // Add the third level object to the second level object images[sectionName][fileMap] = fileMapObj; // Add forth level associate array key and value data images[sectionName][fileMap][fileId] = fileValue; images[sectionName][fileMap][fileId2] = fileValue2; // All variables alert ("Example 1 Value: " + images[sectionName][fileMap][fileId]); // All keys with dots alert ("Example 2 Value: " + images.TestSection.fileMapData.foobar); // Mixed with a different final key alert ("Example 3 Value: " + images[sectionName]['fileMapData'][fileId2]); // Mixed brackets and dots... alert ("Example 4 Value: " + images[sectionName]['fileMapData'].barfoo); // This will FAIL! variable names must be in brackets! alert ("Example 5 Value: " + images[sectionName]['fileMapData'].fileId2); // Produces: "Example 5 Value: undefined". // This will NOT work either. Values must be quoted in brackets. alert ("Example 6 Value: " + images[sectionName][fileMapData].barfoo); // Throws and exception and stops execution with error: fileMapData is not defined // We never get here because of the uncaught exception above... alert ("The End!"); </script>
fuente
var myObj = []; myObj['Base'] = []; myObj['Base']['Base.panel.panel_base'] = {ContextParent:'',ClassParent:'',NameParent:'',Context:'Base',Class:'panel',Name:'panel_base',Visible:'',ValueIst:'',ValueSoll:'', Align:'', AlignFrom:'',AlignTo:'',Content:'',onClick:'',Style:'',content_ger_sie:'',content_ger_du:'',content_eng:'' }; myObj['Base']['Base.panel.panel_top'] = {ContextParent:'',ClassParent:'',NameParent:'',Context:'Base',Class:'panel',Name:'panel_base',Visible:'',ValueIst:'',ValueSoll:'', Align:'',AlignFrom:'',AlignTo:'',Content:'',onClick:'',Style:'',content_ger_sie:'',content_ger_du:'',content_eng:'' }; myObj['SC1'] = []; myObj['SC1']['Base.panel.panel_base'] = {ContextParent:'',ClassParent:'',NameParent:'',Context:'Base',Class:'panel',Name:'panel_base',Visible:'',ValueIst:'',ValueSoll:'', Align:'', AlignFrom:'',AlignTo:'',Content:'',onClick:'',Style:'',content_ger_sie:'',content_ger_du:'',content_eng:'' }; myObj['SC1']['Base.panel.panel_top'] = {ContextParent:'',ClassParent:'',NameParent:'',Context:'Base',Class:'panel',Name:'panel_base',Visible:'',ValueIst:'',ValueSoll:'', Align:'',AlignFrom:'',AlignTo:'',Content:'',onClick:'',Style:'',content_ger_sie:'',content_ger_du:'',content_eng:'' }; console.log(myObj); if ('Base' in myObj) { console.log('Base found'); if ('Base.panel.panel_base' in myObj['Base']) { console.log('Base.panel.panel_base found'); console.log('old value: ' + myObj['Base']['Base.panel.panel_base'].Context); myObj['Base']['Base.panel.panel_base'] = 'new Value'; console.log('new value: ' + myObj['Base']['Base.panel.panel_base']); } }
Salida:
La operación de matriz funciona. No hay ningún problema.
Iteración:
Object.keys(myObj['Base']).forEach(function(key, index) { var value = objcons['Base'][key]; }, myObj);
fuente