aiky,
наверное, все тут сговорились вас огорчать :-), но всё-таки кириллицу в ключах лучше не использовать. У меня от этого были проблемы в Опере. Предположительно, этих проблем можно было бы избежать с помощью Юникод. Но наверняка я этого не знаю, поэтому решил проблему радикально - с помощью escape. В нашем случае можно делать примерно так:
var arr = ['Сахар','Сахар','Молоко','Огурцы','Молоко','Молоко','Молоко','Мед','Огурцы','Сахар'],
tmp = [], names = {}, out = '', l = arr.length, i = j = -1, k,
cmp = function(a, b) {return b[1] - a[1]},
add = function (name) {
//список уникальных имён
if (!(name in names)) names[name] = ++j
k = tmp[names[name]]
//пополняем массив сортировки (или количество в существующем элементе)
tmp[names[name]] = [k && k[0] || unescape(name), (k && k[1] || 0) + 1]
};
while (++i < l) add(escape(arr[i]))
tmp.sort(cmp)
alert(tmp.join('; '))