#javascript
#javascript
Вопрос:
Я начинаю с javascript. Я пытаюсь создать небольшую программу, которая составляет статистику по количеству ответов, найденных в текстовом документе.
Ситуация такова: каждый вопрос имеет один идентификатор, например, 8000001
и W
если ответ хороший или R
если ответ плохой, например, для пользовательского ответа 8000001W
. У многих пользователей так много вопросов об одном и том же идентификаторе. Я хочу получить количество хороших ответов на вопросы. Например, идентификатор: 800001 есть W: 24 and "R": 5
.
Я разделил ответ на id
для 8000001
и ans
для W
или R
. Я хотел создать ассоциативную таблицу, чтобы получить question[id]=["W": 0, "R": 0]
. Но я блокирую это. Я пробовал этот код:
var tab = [];
tab[0] = [];
tab[0] = ['8000001W', '8000002W', '8000003W', '8000004R', '8000005W', '8000006R'];
tab[1] = [];
tab[1] = ['8000001R', '8000002W', '8000003R', '8000004W', '8000005R', '8000006W'];
var question = [];
var id;
for (var i=0;i<tab.length;i ) {
document.write("<dl><dt>tableau n° " i "</dt>");
for (var propriete in tab[i]) {
id = tab[i][propriete].slice(0,7);
var ans = tab[i][propriete].slice(7,8);
question[id] = [];
if(question[id]){
incrementResp.call(rep, ans);
}else{
var rep = initResp(ans);
question[id] = rep;
}
}
document.write("</dl>");
}
function incrementResp(type){
this.this ;
}
function initResp(t){
rep = [];
rep.W = (t=='W'?1:0);
rep.R = (t=='R'?1:0);
}
Комментарии:
1. Что случилось с
<blink>
тегом?2. извините, это было из-за stackoverflow. Этого нет в моем коде
3. Не могли бы вы немного подробнее объяснить свой код? Я не смог получить большую часть этого. if(question [id]) всегда будет true, потому что вы присваиваете ему значение.
4. В javascript нет ассоциативных массивов. Вероятно, вам нужен объект:
{R: 0, W: 0}
.
Ответ №1:
В зависимости от того, что вы хотите, наконец, «вопрос» следует использовать в качестве объектного литерала, определенного как question = {}
(аналогично массиву ассоциаций), то, что вы определили здесь, является литералом массива. Вы можете проверить это для получения дополнительной информации о различных типах литералов в JavaScript:
https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Values ,_variables,_and_literals#Литералы
С точки зрения вашего кода, вы можете просто сделать вот так:
if (question[id]) {
question[id][ans] = 1;
}
else {
var rep = initResp(ans);
question[id] = rep;
}
Также вашей функции ‘initResp’ лучше возвращать объектный литерал ‘rep’, а не как литерал массива:
function initResp(t){
var rep = {};
rep.W = (t=='W'?1:0);
rep.R = (t=='R'?1:0);
return rep;
}
Комментарии:
1.
if (question[id]) {
должно быть,if (id in question) {
потому что{}
оценивается какtrue
. Смотритеif ({}) console.log("a");
.2. Спасибо за разъяснение. Но в данном конкретном случае мы никогда не получаем
question[id]={}
, это либоquestion[id]={W:0, R:0}
, либоquestion[id]=undefined
.3. Затем вы можете удалить
else
блок иinitResp
функцию. Вы должны отредактироватьquestion[id]={W:0, R:0}
свой ответ.4. Ну, я думаю, мы могли бы избавиться от функции ‘initResp’, поскольку она просто создает новый объектный литерал
{W:0, R:1}
в зависимости от того, является ли последний символ ‘W’ или ‘R’. Ноelse
блок следует сохранить на случай, если объект вопроса не содержит нового «идентификатора»5. @Artjom B Я думаю, я знаю, почему вы сказали, что
else
могут быть удалены. Фрагмент кода, который я привел здесь, не является полным,if..else
обернут вложенным циклом. Таким образом,question
объект фактически создается динамически. Количество элементов вquestion
объекте зависит от того, сколько итераций у нас есть
Ответ №2:
Для «ассоциативного массива» в JavaScript используйте обычный объект. В приведенном ниже коде «результаты» являются одним из таких объектов. Он имеет два ключа, «W» и «R», которые указывают на числа, начинающиеся с 0. Просто перебирайте свои массивы ответов и непрерывно увеличивайте правильный ключ.
Существует два способа доступа к ключу в объекте: 1) с помощью скобок, 2) с использованием обозначения «точка». В цикле я использую квадратные скобки, потому что ‘key’ является переменной — она преобразуется в «W» или «R» и, следовательно, получает доступ к ключу «W» или «R» в этом объекте. В последних двух строках я использую точечную нотацию, потому что «W» и «R» — это буквально ключи, к которым я хочу получить доступ. Это также сработало бы, если бы я сделал это вместо: results['W']
и results['R']
.
var tab = [];
tab[0] = ['8000001W', '8000002W', '8000003W', '8000004R', '8000005W', '8000006R'];
tab[1] = ['8000001R', '8000002W', '8000003R', '8000004W', '8000005R', '8000006W'];
var results = {
W: 0,
R: 0
};
// go through each tab
for (var tabIdx = 0; tabIdx < tab.length; tabIdx ) {
// go through each answer and apppend to an object that keeps the results
for (var i = 0; i < tab[tabIdx].length; i ) {
var answer = tab[tabIdx][i];
// the last character in the string is the "key", (W or R)
var key = answer.slice(-1);
// append to the results object
results[key] ;
}
}
console.log(results);
console.log(results.W); // 7
console.log(results.R); // 5
Откройте консоль разработки (в Chrome это F12), чтобы увидеть результат.
Комментарии:
1. Это я сделал. Но моя проблема, я не хотел получать общее количество всех «W» и «R». Но итог по вопросу. например, 800001R, 800001W, 800001R, 800001W, 800001W результатом будет 800001 R = 2 и W = 3
2. Спасибо вам за ваш ответ
3. Нет проблем, я обновил свой ответ. Теперь значения представляют собой числа, которые начинаются с нуля и увеличиваются в цикле.
Ответ №3:
Вот как я решил свою проблему для ассоциативного массива.
var tab = [];
tab[0] = ['8000001W', '8000002W', '8000003W', '8000004R', '8000005W', '8000006R'];
tab[1] = ['8000001R', '8000002W', '8000003R', '8000004W', '8000005R', '8000006W'];
tab[2] = ['8000001R', '8000002W', '8000003R', '8000004W', '8000005R', '8000006W'];
var question = {};
for (var tabIndex = 0; tabIndex < tab.length; tabIndex ) {
for (var i = 0; i < tab[tabIndex].length; i ) {
var answer = tab[tabIndex][i];
var id = answer.slice(0,7);
var ans = answer.slice(-1);
if (question[id]) {
question[id][ans] = 1;
}else {
var results = initResp(ans);
question[id] = results;
}
}
}
console.log(question);
function initResp(t) {
var results = [];
results.W = (t === 'W' ? 1 : 0);
results.R = (t === 'R' ? 1 : 0);
//console.log(results);
return results;
}