Массив и увеличение значения Элемента массива
Доброго времени суток всем ГУРУ!
Я новичок в javascript! Пишу программку и столкнулся с такой проблемой: при выполнении условия (в массиве refferee[j][i] есть совпадение значения например '1') нужно значение второго массива увеличить на один. Вопрос: такая конструкция рабочая r[j][i]++; ??? вот листинг:
for (var j=0; j<sumparticipant; j++)
{
for (var i=0; i<sumrefferee; i++)
{
switch (refferee[j][i])
{
case 1: r[j][i]++;
case 1: case 2: r[j][i]++;
case 1: case 2: case 3: r[j][i]++;
case 1: case 2: case 3: case 4: r[j][i]++;
case 1: case 2: case 3: case 4: case 5: r[j][i]++;
case 1: case 2: case 3: case 4: case 5: case 6: r[j][i]++;
}
}
}
sumparticipant - число заданное заранее; sumrefferee - число заданное заранее; refferee[j][i] - массив чисел полученный опросом полей input по getElementsByName (проверял внутри есть данные); r[j][i] - массив счетчик, который должен посчитать количество чисел в массиве refferee[j][i]. Голова пухнет, по моему я застрял именно на счетчике. Прошу опытных пользователей о помощи! Заранее спс! |
:-? ничего не понимаю
|
Цитата:
|
да, но почему то там остается 0 ане 1
|
В целом задача: мне нужно посчитать сколько в строке refferee[1][i] значений 1, потом 1или2, потом 1 или2или3 и т.д.
Но походу моих знаний JS не хватает чтоб построить код ((( |
мне не совсем понятно что тебе нужно )), покажи пример строк и что надо с ними сделать, а так тяжело понять, ты явно что-то не то делаешь...
|
Вложений: 1
![]() Столбцы a,b,c,d,e - входящие данные, согласно строк 11,21,31..61 выставляются цыфры от 1 до 6 (6 - количество строк, может быть и 8, и более, тогда будет выставляться до 8 или более) В столбцы 1,1-2,1-3..1-6 нужно посчитать согласно строки сколько цыфр 1,1ил2, 1или2или3... . по сути это определения результатов выступления: Строки количество желающих выступить (в примере 6, поэтому 6 мест), Столбцы с судьями (a,b,c,d,e) и они тоже могут быть 5, могут более или менее, которые выставляют балы (от 1 до 6-или сколько участников). В примере показано как должно быть посчитано. Для 6 строк и 5 судей статически я написал громоздкий код. Теперь надо привести код так, чтоб я не зависил от количества выступающих (а вдруг их 40 или 100) и количества судей. |
case - тоже на ограниченное количество выступлений - 6. пока не знаю как на неограниченное поставить
|
Romzes,
а зачем считать столько 1 и т.д. может сразу сумму баллов? |
так определено правилами, арифметически не определить.
По сути это не балы, а места. тоесть судья выставляет места. программа должна посчитать кому судьи больше отдали первых, вторых и .т.д. мест. поэтому нужно количество первы, первы ивторых мест, первых и вторых и третих месть и т.д. короче правила дебильные, но по ним надо получить результат |
Romzes,
таблица как формируется? |
вот пример
//данные с оценками от судей
a =
[
[1,5,1,1,2],
[2,2,5,4,1],
[3,3,3,2,3],
[4,4,2,3,4],
[5,1,4,5,5],
[6,6,6,6,6]
];
//создаем массив для оценок, заполняем нулями
var b = a.map(()=>[]);
for (var i=0; i<a.length; i++){
for (var j=0; j<6; j++) b[i][j] = 0;
}
//тут считаем сколько каких оценок, b[0][0] - 1, b[0][1] - 2 и т.д.
for (var i = 0; i < a.length; i++){
for (var j = 0; j < a[i].length; j++){
switch(a[i][j]){
case 1: b[i][0]++;
break;
case 2: b[i][1]++;
break;
case 3: b[i][2]++;
break;
case 4: b[i][3]++;
break;
case 5: b[i][4]++;
break;
case 6: b[i][5]++;
break;
}
}
}
alert(`${b[0]}\n${b[1]}\n${b[2]}\nи т.д.`);
в массиве b посчитанно сколько каких оценок, а дальше просто суммируешь |
Lion777,
а место итоговое как вычислить? |
если бы автор описал как вычисляется ))), то, возможно, бы и вычислил в этой странной системе оценок ))...
|
Lion777,
а зачем switch...case?
//данные с оценками от судей
a =
[
[1,5,1,1,2],
[2,2,5,4,1],
[3,3,3,2,3],
[4,4,2,3,4],
[5,1,4,5,5],
[6,6,6,6,6]
];
//создаем массив для оценок, заполняем нулями
var b = a.map(()=>[]);
for (var i=0; i<a.length; i++){
for (var j=0; j<6; j++) b[i][j] = 0;
}
//тут считаем сколько каких оценок, b[0][0] - 1, b[0][1] - 2 и т.д.
for (var i = 0; i < a.length; i++){
for (var j = 0; j < a[i].length; j++){
b[i][a[i][j] - 1]++;
}
}
alert(`${b[0]}\n${b[1]}\n${b[2]}\nи т.д.`);
|
баг в версии 1.00 ))
|
Цитата:
Цитата:
Lion777, Dilettante_Pro, Цитата:
формула должна быть универсальной для любого количества участников и судей. ТС куда-то пропал ... |
Пошел другим путем, отсортировал значения массива первой строки, посчитал повторы, и потом суммировал предыдущую ячейку массива с текущей.
|
Цитата:
|
Вот что у меня получилось, правда только для одного участника. сейчас буду доделывать для много участников
var sumparticipant=6; //количество участников
var sumrefferee=5; //количество судей
var reffereeGet = document.getElementsByName('refferee');
var refferee=new Array();
// Присваеваем все input в массив refferee[j][i]
metka1:
for (var j=0; j<sumparticipant; j++)
{
refferee[j]=new Array();
for (var i=0; i<sumrefferee; i++)
{
refferee[j][i]=reffereeGet[i].value;
if (typeof refferee[j][i] == 'undefined' || refferee[j][i] == null || refferee[j][i] == 0)
{
var arb=i+1;
alert ('Судья '+arb+' не определил место'); break metka1;
}
}
}
// сортируем масив 1,2,3,4,5 и.т.д.
function compareNumeric(a, b) {
if (a > b) return 1;
if (a < b) return -1;
}
refferee[0].sort(compareNumeric);
//считаем количество повторов
var result = {};
for (var i = 0; i < sumrefferee; ++i)
{
var a = refferee[0][i];
if (result[a] != undefined)
++result[a];
else
result[a] = 1;
}
var result1 = {};
// выводим результат в масив result1[i]
for (var key in result)
{
for (var i=1; i<sumparticipant+1; i++)
{
if (i==key)
{
result1[i]=result[key];
}
}
}
// заменяем пустые значения на 0
for (var i=1; i<sumparticipant+1; i++)
{
if (typeof result1[i] == 'undefined' && result1[i] == null)
{
result1[i]=0;
}
}
// суммируем предедущее значение с настоящим 2+1
for (var i=2; i<sumparticipant+1; i++)
{
result1[i]=result1[i-1]+result1[i];
}
//выводим результаты
for (var i=1; i<sumparticipant+1; i++)
{
document.getElementsByName('r')[i-1].value=result1[i];
}
Код конечно громоздкий, но я новичек, простите если что :( :) |
Цитата:
|
данный код уже универсален, там достаточно только указать исходные данные, он без case автоматический, осталось только остальные подсчеты сделать
|
Цитата:
|
Цитата:
2 место - ток у кого больше 1-2 мест, если одинаково то ток у кого больше 1х мест и по такому подобию называется Скейтинг |
У меня опять стопор
var reffereeGet = document.getElementsByName('refferee'); var z=0;
metka1:
for (var j=0; j<sumparticipant; j++)
{
refferee[j]=new Array();
for (var i=0; i<sumrefferee; i++)
{
refferee[j][i]=reffereeGet[z].value;
z++;
if (typeof refferee[j][i] == 'undefined' || refferee[j][i] == null || refferee[j][i] == 0)
{
var arb=i+1;
alert ('Судья '+arb+' не определил место'); break metka1;
}
}
}
document.write('1 - '+ refferee[0][0] + '<br>2 - '+ refferee[0][1] + '<br>3 - '+ refferee[0][2] + '<br>4 - '+ refferee[0][3] + '<br>5 - '+ refferee[0][4]+
'<br><br>6 - '+ refferee[1][0] + '<br>7 - '+ refferee[1][1] + '<br>8 - '+ refferee[1][2] + '<br>9 - '+ refferee[1][3] + '<br>10 - '+ refferee[1][4]);
Почему в строке 8 я не могу использовать переменную z в выражении "reffereeGet[z].value" ??? Если я ставлю i - то работает, если z - не работает. Хотя переменная z++ считается до 30 (согласно циклу) ,выводится значение А нужно это чтоб разделить одномерный массив полученный путем опроса input (var reffereeGet = document.getElementsByName('refferee'); ) на двухмерный, то есть построчно |
Цитата:
|
Цитата:
Не понятно выражение var b = a.map(()=>[]); |
Romzes,
без комментариев ... ввести места в инпуты(1...6), получить результат
<!DOCTYPE html>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">
<style type="text/css">
.total tr td:last-child {
color: #FF0000;
font-size: 28px
}
td {
height: 22px; width: 80px; text-align: center;
font-weight: bold;
}
</style>
</head>
<body>
<div class="refferee"></div>
<div class="total"></div>
<script>
function fn(f) {
var c = f.map(function(a, g) {
for (var d = [], b = 1, e = f.length; b <= e; b++) {
var c = a.filter(function(a) {
return a == b
}).length;
d.push(c)
}
return d
});
c.slice(0).sort(function(a, c) {
for (var d, b = 0, e = a.length; b < e; b++)
if (d = c[b] - a[b]) return d;
return 0
}).forEach(function(a, c) {
a.push(++c)
});
return c
}
function createTable(row, col, parent, mas) {
var table = document.createElement("table"),
arr = [];
var f = function(a, b, c) {
return function() {
arr[a][b] = +c.value || 0;
var res = fn(arr);
out(res)
}
};
for (var i = 0; i < row; i++) {
var tr = table.insertRow(i);
arr[i] = [];
for (var j = 0; j < col; j++) {
var td = tr.insertCell(j);
if (mas) td.textContent = mas[i][j];
else {
arr[i][j] = 0;
var input = document.createElement("input");
input.addEventListener("input", f(i, j, input));
td.appendChild(input)
}
}
}
parent.appendChild(table);
return arr
}
function out(arr) {
total.innerHTML = "";
createTable(arr.length, arr[0].length, total, arr)
}
var total = document.querySelector(".total");
var refferee = document.querySelector(".refferee");
var mas = createTable(6, 5, refferee);
var res = fn(mas);
out(res);
</script>
</body>
</html>
|
Ну об этом стоит почитать, метод map объекта Array и стрелочные функции
|
Цитата:
за код спасибо. буду разбираться. Правда чуть не то 1 - столбец количество 1х мест, 2 столбец - количество ПЕРВЫХ И ВТОРЫХ мест и т.д. Короче система неординарная и сложная. поскольку я новичок, сложно разобраться в Вашем коде, но я непременно постараюсь. |
Цитата:
|
Цитата:
|
рони крутой ))
|
Цитата:
так вот если я ввожу : 1,2,3,4,5 то подсчет выглядет у Вас 1,1,1,1,1 а должен: 1,2,3,4,5. У вас 1,1,1,1,1 |
Цитата:
|
Ронни, все равно спасибо за помощь. Я вижу к чему стремится, надо новые функции разбирать ))) Я все равно к сожалению не смогу использовать ваш код, так как я должен сам написать и разбираться. Сейчас у меня что то получается, правда код громоздкий, возможно неудобный. Я сторонник что б не за меня сделали, а сам.
Подскажите форумчане, может кто знает как просто разбить одномерный массив в двумерный. что то гуглю и не один пример не пойму (( |
Цитата:
не осилил , что не так ? откуда 1,2,3,4,5 взялось в весах |
Вложений: 1
Цитата:
|
Romzes,
ок ... давайте посмотрим результат колонка место - вдруг будет совпадение? мой алгоритм 1, 2, 4, 5, 3, 6 а ваш? |
Romzes,
если очень хочется, добавил плюс в 3-4 строку, будет вам 1245 заменить в коде функцию пост № 28
function fn(f) {
var c = f.map(function(a, g) {
for (var d = [], b = 1, e = f.length, c = 0; b <= e; b++) {
c += a.filter(function(a) {
return a == b
}).length;
d.push(c)
}
return d
});
c.slice(0).sort(function(a, c) {
for (var d, b = 0, e = a.length; b < e; b++)
if (d = c[b] - a[b]) return d;
return 0
}).forEach(function(a, c) {
a.push(++c)
});
return c
}
|
| Часовой пояс GMT +3, время: 06:49. |