2012-10-25 12 views
14

Powiel możliwe:
Set undefined javascript property before readTablica JavaScript z wartościami domyślnymi (odpowiednik domyślnego słownika Pythona)?

Czy istnieje odpowiednik Python's defaultdict w JavaScript? Byłaby to tablica JavaScript, w której wartość zwrócona dla brakującego klucza jest definiowalna. Coś jak:

var a = defaultArray("0"); 
console.log(a['dog']); 
// would print 0 

Jeśli nie, w jaki sposób można go wdrożyć?

+0

http://stackoverflow.com/questions/812961/javascript-getters-and-setters-for-dummies – goat

+0

Bergi i Rambo, dzięki, ale nie sądzę, albo z tych robią to, czego szukam. Nie zamierzam zaimplementować a.get ("pies") - szukam ["psa"], aby zwrócić jakąś wartość domyślną. W ten sposób kod korzystający z tablicy może traktować go jako zwykłą tablicę. – Parand

Odpowiedz

3

Nie, to nie jest możliwe w JavaScript. Btw, na pewno oznaczało Objects (mapy wartości właściwości) zamiast tablic. Dwa rozwiązania:

  • zaimplementować obiekt jako Proxy, którego celem jest dokładnie to, co chcesz zrobić. Jednak jest to tylko wersja robocza i obecnie tylko supported in Firefox' Javascript 1.8.5.

  • Użyj funkcji gettera z parametrem ciągowym zamiast właściwości obiektu. Ta funkcja może wyszukać klucz wejściowy w wewnętrznym obiekcie "słownikowym", a uchwyt omija programowo - np. tworzenie wartości dynamicznie lub zwracanie wartości domyślnych.

    Oczywiście można zbudować fabrykę dla takich funkcji pobierających.

function defaultDict(map, default) { 
    return function(key) { 
     if (key in map) 
      return map[key]; 
     if (typeof default == "function") 
      return default(key); 
     return default; 
    }; 
} 

var a = defaultDict({cat: 1}, 0); 
console.log(a('cat')); // 1 
console.log(a('dog')); // 0 
+0

Dzięki Bergi. Szkoda, naprawdę miałem nadzieję, że istnieje odpowiednik. – Parand

+0

Z pewnym rozszerzeniem w kodzie, aby dodać nowe wartości, będziesz miał tę samą funkcjonalność co collections.defaultdict py. – Luchux

+1

Zrobiłem to, o czym mówi @Luchux w [pycollections.js] (http://github.com/seriesoftubes/pycollections.js). –

Powiązane problemy