Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Группировка в двухмерном массиве (https://javascript.ru/forum/misc/10367-gruppirovka-v-dvukhmernom-massive.html)

corbon 30.06.2010 22:07

Группировка в двухмерном массиве
 
Всем привет!
Подскажите как лучше в Javascript реализовать группировку в двухмерном массиве с суммированием значений.
Имеем матрицу вида:
12.01.2010 32 45 12
12.01.2010 3 33 56
14.01.2010 89 67 98
11.01.2010 9 22 9
12.01.2010 67 99 23
13.01.2010 54 77 5

необходимо привести к виду:
12.01.2010 102 177 91
14.01.2010 89 67 98
11.01.2010 9 22 9
13.01.2010 54 77 5

Заранее спасибо!

Sweet 30.06.2010 22:35

if('Подскажите как реализовать'=='Сделайте, а то мне лениво вникать') alert('Пшел вон!!!')

x-yuri 01.07.2010 05:59

возможно, лучше сделать это в БД
но если делать в js... какие ты видишь варианты?

corbon 01.07.2010 08:42

В БД не хотелось бы, в js кроме варианта как перебрать записи в массиве и класть в другой массив сравнивая и суммирую их пока не придумал, поэтому написал сюда, есть другие варианты?

B@rmaley.e><e 01.07.2010 09:54

Как вариант: использовать другой массив для хранения индексов первых элементов каждого ключа. При встрече с ключем проверяем, нет ли у нас его идекса в массиве. Если есть, то прибавляем значения текущего ряда к ряду, полученному по индексу и удаляет текущий ряд, иначе сохраняем индекс.
Проблема лишь в том, что из-за этого образуются "дырки" в массиве, т.е. как-то так:
0 - array
1 - undefined
2 - undefined
3 - array
4 - undefined

x-yuri 01.07.2010 11:28

Цитата:

Сообщение от corbon
В БД не хотелось бы

а что значит не хотелось бы? Не умею, поэтому буду делать как прийдется?

corbon 01.07.2010 11:51

Цитата:

Сообщение от x-yuri (Сообщение 61819)
а что значит не хотелось бы? Не умею, поэтому буду делать как прийдется?

В БД как раз это делается очень легко и с этим проблем нет. Дело в том что я получаю эти данные в xml, кладу в массив, обрабатываю и кладу в БД. Агрегировать их потом в БД мне не очень удобно. Поэтому и спрашиваю нет ли какого механизма в js который позволяет делать группировки, аналог array_unique, array_count_values итп в php например. Спасибо.

corbon 01.07.2010 11:52

Цитата:

Сообщение от x-yuri (Сообщение 61819)
а что значит не хотелось бы? Не умею, поэтому буду делать как прийдется?

Цитата:

Сообщение от B@rmaley.e><e (Сообщение 61816)
Как вариант: использовать другой массив для хранения индексов первых элементов каждого ключа. При встрече с ключем проверяем, нет ли у нас его идекса в массиве. Если есть, то прибавляем значения текущего ряда к ряду, полученному по индексу и удаляет текущий ряд, иначе сохраняем индекс.
Проблема лишь в том, что из-за этого образуются "дырки" в массиве, т.е. как-то так:
0 - array
1 - undefined
2 - undefined
3 - array
4 - undefined

Спасибо за алгоритм, примерно так я себе это и представлял, просто думал может в js есть более простой вариант .

рони 01.07.2010 13:03

а мы тут плюшками балуемся
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

<head>
  <title></title>
</head>

<body>
<script language="JavaScript" type="text/javascript">
a=[];
a[0]="12.01.2010 32 45 12";
a[1]="12.01.2010 3 33 56";
a[2]="14.01.2010 89 67 98";
a[3]="11.01.2010 9 22 9";
a[4]="12.01.2010 67 99 23";
a[5]="13.01.2010 54 77 5";
b=[];
for (var d = 0; d < a.length; d++) {
    c = a[d].split(/\s+/g);
    if (b[c[0]] == null) b[c[0]] = [c[0], 0, 0, 0];
    b[c[0]][1] += parseInt(c[1], 10);
    b[c[0]][2] += parseInt(c[2], 10);
    b[c[0]][3] += parseInt(c[3], 10)
}
a = [];
d = 0;
for (k in b) {document.write(a[d++]=b[k].join(" ") + "<br />")};
</script>
</body>

</html>

corbon 01.07.2010 16:36

Рони, спасибо!


Часовой пояс GMT +3, время: 00:32.