Как проверить, присутствует ли идентификатор в ассоциативном массиве

#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} .

5. andrewdupont.net/2006/05/18/…

Ответ №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;
}