2012-06-21 6 views
1

У меня есть массив строк переменной длины, объявленный в javascript, который содержит имена классов Dungeons and Dragons. Пример этого является ниже:Подведение массива строк javascript

var class_names = new Array("Wizard", "Wizard", "Wizard", "Sorcerer", 
    "Sorcerer", "Ultimate Magus"); 

В моем HTML, я использую яваскрипт window.onload функцию, чтобы установить различные переменные из файла JavaScript для создания содержимого страницы, отображаемого на место.

Для таких вещей, как имя, это легко:

document.getElementById('charname').innerHTML = name[0]; 

Но для информации класса, я не хочу, чтобы просто выкачивать массивную цепочку имен классов, я хочу конденсируется вниз. Используя пример «class_names» выше, я хочу закончить со строкой, которая выглядит следующим образом:

«Мастер 3, Колдун 2, Ultimate Волхв 1»

т.е. число после каждого имени класса должен быть количество повторений, найденных в массиве.

У кого-нибудь есть идея, как это осуществить на лету, поэтому, когда я изменяю файл javascript для добавления дополнительных данных класса в класс_names, он отображается соответствующим образом на моей HTML-странице?

Заранее спасибо за любую помощь, которую я получаю в этом проекте для домашних животных (а именно, создание страницы HTML для каждого персонажа в моей кампании, которая может быть распечатана как листок символов ... это намного лучше, чем вручную писать страницу для каждого персонажа или почеркнуть его на листе ванили).

ответ

3

Это достаточно просто, просто пройдите через массив и повторите подсчет.

var l = class_names.length, i, tmp = {}, ret = []; 
for(i=0; i<l; i++) { 
    if(!tmp[class_names[i]]) tmp[class_names[i]] = 0; 
    tmp[class_names[i]]++; 
} 
for(i in tmp) { 
    if(tmp.hasOwnProperty(i)) { 
     ret.push(i+" "+tmp[i]); 
    } 
} 
// output is ret.join(", "); 
+0

Спасибо, это именно то, что мне нужно! –

0

Я думаю, что есть много способов решить вашу проблему ...

Возможность A:

  1. Если вы не знаете, если классы появляются в правильном порядке, попробуйте сначала отсортируйте свой массив, чтобы убедиться, что они сгруппированы правильно.
  2. Итерации по массиву и подсчет повторений, т. Е. Увеличение счетчика, если lastElement === class_names [i] и добавьте результат для последнего имени класса в строку результатов и установите счетчик в 1 в противном случае.

Возможность B: Храните массив непосредственно как [ «Мастер», 3 «Колдун», 2, ...] - это возможно, так как JS не требует массивов содержит один и тот же тип элемента в каждая позиция.

Возможность C: Использовать другую структуру, например. используя объекты: var class_names = [{name: "Wizard", level: 3}, {name: "Sorcerer", level: 2}, ...]