В JavaScript я хочу сделать следующее:значения по умолчанию для вложенных Javascript хэшей
var pi = {}; pi[0]['*']['*'] = 1;
, конечно, это бросает «Не удается прочитать свойство„*“неопределенной» ошибка. Ясно, что я могу определить p [0] = {}, но это какая-то боль, поскольку я буду придерживаться множества разных значений в разных атрибутах, например.
pi[2]['O']['I-GENE'] = 1;
и т.д. первый ключ в хэш только целое число, так что я думаю, я мог бы использовать массив на верхнем уровне, а не хэш, а затем по умолчанию инициализировать как в этом посте:
, но это не значит, что мне нужна инициализация других хэшей по умолчанию.
Это действительно кажется, что я пытаюсь сделать, это работает против спецификации ECMAScript, которая указывает, что неопределенные атрибуты объекта (который является хэш в JavaScript) должен возвращать неопределенными, как упомянуто здесь:
Set default value of javascript object attributes
который интересно включает в себя опасную работу.
В других местах, где я пытаюсь использовать вложенные хэши, как это я окажусь писать длинные биты некрасивого кода, как это:
function incrementThreeGramCount(three_grams,category_minus_two,category_minus_one,category){
if(three_grams[category_minus_two] === undefined){
three_grams[category_minus_two] = {};
}
if(three_grams[category_minus_two][category_minus_one] === undefined){
three_grams[category_minus_two][category_minus_one] = {};
}
if(three_grams[category_minus_two][category_minus_one][category] === undefined){
three_grams[category_minus_two][category_minus_one][category] = 0;
}
three_grams[category_minus_two][category_minus_one][category]++;
}
, который я бы очень хотел, чтобы избежать здесь, или по крайней мере найти хороший способ добавления функциональности Hash через прототип метода. Однако похоже, что, поскольку Hash и Object в JavaScript - это одно и то же, мы не можем по-настоящему играть с поведением хэш-стиля по умолчанию в JavaScript, не влияя на многие другие вещи ...
Возможно, мне стоит написать свой собственный Hash класс ... или с помощью Прототипы:
http://prototypejs.org/doc/latest/language/Hash/
или чужого:
http://www.daveperrett.com/articles/2007/07/25/javascript-hash-class/
или MooTools:
http://mootools.net/docs/more/Types/Hash
Argh, так много вариантов - хотелось бы знать, лучшие практики здесь ...
Хей - это напоминает мне о спорном PR на MooTools в прошлом году: https://github.com/mootools/mootools-core/pull/2191 - Object.get/set methods (not .prototype), который сделал это автоматически. Не приземлился, и Даниэль прекратил вносить свой вклад, поскольку: D - его реализация была вполне разумной - https://github.com/csuwldcat/mootools-core/blob/master/Source/Types/Object.js#L23-L43 - может легко работать w/o mootools –