Istnieją następujące wyniki zapytania: (klucz1 i klucz2 mogą być dowolnym tekstem)
id key1 key2 value
1 fred apple 2
2 mary orange 10
3 fred banana 7
4 fred orange 4
5 sarah melon 5
...
i chcę przechowywać dane w siatce (może jako tablica) zapętlając wszystkie rekordy w ten sposób:
apple orange banana melon
fred 2 4 7 -
mary - 10 - -
sarah - - - 5
W PHP byłoby to naprawdę łatwe, używając tablic asocjacyjnych:
$result['fred']['apple'] = 2;
Ale w tablicach asocjacyjnych JavaScript takich jak ta nie działa. Po przeczytaniu mnóstwa samouczka, wszystko, co mogłem uzyskać, to:
arr=[];
arr[1]['apple'] = 2;
ale arr['fred']['apple'] = 2;
nie działa. Próbowałem tablic obiektów, ale właściwości obiektów nie mogą być dowolnym tekstem. Im więcej czytałem samouczki, tym bardziej byłem zdezorientowany ...
Każdy pomysł jest mile widziany :)
var grid = {};grid['aa']['bb'] = 1;
zwracają „Uncaught TypeError: Cannot set property 'bb' undefined". Mogę się mylić, ale w przypadku większości twoich przykładów muszę znać dane w czasie inicjalizacji.var grid = {}; grid['aa'] = {}; grid['aa']['bb'] = 1;
działa. Bardziej złożony test kończy się niepowodzeniem, ale wygląda na to, że jestem na dobrej drodzeOdpowiedzi:
Po prostu użyj zwykłego obiektu JavaScript, który „czyta” w taki sam sposób jak tablice asocjacyjne. Musisz również pamiętać o ich inicjalizacji.
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 } };
Jeśli przeglądasz wartości, możesz mieć coś, co wygląda tak:
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; } }
źródło
grid[name] = {};
obj["fred.apples"]
na przykładJeśli nie musi to być tablica, możesz utworzyć „wielowymiarowy” obiekt JS ...
<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>
źródło
Javascript jest elastyczny:
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]);
źródło
Ponieważ potrzebowałem uzyskać wszystkie elementy w przyjemny sposób, natknąłem się na temat SO „Przechodzenie przez 2-wymiarową tablicę asocjacyjną / obiekt” - bez względu na to, jak się nazywam, bo liczy się funkcjonalność.
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]); } }
źródło
Wydaje się, że w przypadku niektórych aplikacji istnieje znacznie prostsze podejście do wielowymiarowych tablic asocjacyjnych w javascript.
Biorąc pod uwagę, że wewnętrzna reprezentacja wszystkich tablic jest w rzeczywistości obiektami obiektów, wykazano, że czas dostępu do elementów indeksowanych numerycznie jest w rzeczywistości taki sam, jak w przypadku elementów indeksowanych asocjacyjnie (tekstowo).
czas dostępu do indeksowanych asocjacyjnych elementów pierwszego poziomu nie rośnie wraz ze wzrostem liczby rzeczywistych elementów.
Biorąc to pod uwagę, może istnieć wiele przypadków, w których faktycznie lepiej jest użyć podejścia połączonego ciągu, aby stworzyć równoważność elementów wielowymiarowych. Na przykład:
store['fruit']['apples']['granny']['price] = 10 store['cereal']['natural']['oats']['quack'] = 20
idzie do:
store['fruit.apples.granny.price'] = 10 store['cereal.natural.oats.quack'] = 20
Zalety obejmują:
źródło
Uzyskaj wartość dla tablicy właściwości tablic asocjacyjnych, gdy nazwa właściwości jest liczbą całkowitą:
Rozpoczynając od tablicy asocjacyjnej, w której nazwy właściwości są liczbami całkowitymi:
var categories = [ {"1":"Category 1"}, {"2":"Category 2"}, {"3":"Category 3"}, {"4":"Category 4"} ];
Wypchnij elementy do tablicy:
categories.push({"2300": "Category 2300"}); categories.push({"2301": "Category 2301"});
Przejdź przez tablicę i zrób coś z wartością właściwości.
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 } }
Wynik konsoli powinien wyglądać następująco:
1 : Category 1 2 : Category 2 3 : Category 3 4 : Category 4 2300 : Category 2300 2301 : Category 2301
Jak widać, można obejść ograniczenie tablicy asocjacyjnej i mieć nazwę właściwości będącą liczbą całkowitą.
UWAGA: Tablica asocjacyjna w moim przykładzie to json, który miałbyś, gdybyś zserializował obiekt Dictionary [].
źródło
Nie używaj tablicy, używaj obiektu.
var foo = new Object();
źródło
new Object()
, ponieważ Object.prototype może mieć dołączoną dziwność; użyj dosłownego obiektu:var foo = {};
new Array()
czego należy unikać. ugh.Nie musisz koniecznie używać obiektów, możesz to zrobić z normalnymi wielowymiarowymi tablicami.
Oto moje rozwiązanie bez obiektów :
// Javascript const matrix = []; matrix.key1 = [ 'value1', 'value2', ]; matrix.key2 = [ 'value3', ];
który w PHP jest odpowiednikiem:
// PHP $matrix = [ "key1" => [ 'value1', 'value2', ], "key2" => [ 'value3', ] ];
źródło
<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>
źródło
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']); } }
Wynik:
Operacja tablicowa działa. Nie ma problemu.
Iteracja:
Object.keys(myObj['Base']).forEach(function(key, index) { var value = objcons['Base'][key]; }, myObj);
źródło