30.06.2010, 22:07
|
Новичок на форуме
|
|
Регистрация: 30.06.2010
Сообщений: 5
|
|
Группировка в двухмерном массиве
Всем привет!
Подскажите как лучше в 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
Заранее спасибо!
|
|
30.06.2010, 22:35
|
Профессор
|
|
Регистрация: 16.03.2010
Сообщений: 1,618
|
|
if('Подскажите как реализовать'=='Сделайте, а то мне лениво вникать') alert('Пшел вон!!!')
|
|
01.07.2010, 05:59
|
|
|
|
Регистрация: 27.12.2008
Сообщений: 4,201
|
|
возможно, лучше сделать это в БД
но если делать в js... какие ты видишь варианты?
|
|
01.07.2010, 08:42
|
Новичок на форуме
|
|
Регистрация: 30.06.2010
Сообщений: 5
|
|
В БД не хотелось бы, в js кроме варианта как перебрать записи в массиве и класть в другой массив сравнивая и суммирую их пока не придумал, поэтому написал сюда, есть другие варианты?
|
|
01.07.2010, 09:54
|
|
⊞ Развернуть
|
|
Регистрация: 11.01.2010
Сообщений: 1,810
|
|
Как вариант: использовать другой массив для хранения индексов первых элементов каждого ключа. При встрече с ключем проверяем, нет ли у нас его идекса в массиве. Если есть, то прибавляем значения текущего ряда к ряду, полученному по индексу и удаляет текущий ряд, иначе сохраняем индекс.
Проблема лишь в том, что из-за этого образуются "дырки" в массиве, т.е. как-то так:
0 - array
1 - undefined
2 - undefined
3 - array
4 - undefined
|
|
01.07.2010, 11:28
|
|
|
|
Регистрация: 27.12.2008
Сообщений: 4,201
|
|
Сообщение от corbon
|
В БД не хотелось бы
|
а что значит не хотелось бы? Не умею, поэтому буду делать как прийдется?
|
|
01.07.2010, 11:51
|
Новичок на форуме
|
|
Регистрация: 30.06.2010
Сообщений: 5
|
|
Сообщение от x-yuri
|
а что значит не хотелось бы? Не умею, поэтому буду делать как прийдется?
|
В БД как раз это делается очень легко и с этим проблем нет. Дело в том что я получаю эти данные в xml, кладу в массив, обрабатываю и кладу в БД. Агрегировать их потом в БД мне не очень удобно. Поэтому и спрашиваю нет ли какого механизма в js который позволяет делать группировки, аналог array_unique, array_count_values итп в php например. Спасибо.
|
|
01.07.2010, 11:52
|
Новичок на форуме
|
|
Регистрация: 30.06.2010
Сообщений: 5
|
|
Сообщение от x-yuri
|
а что значит не хотелось бы? Не умею, поэтому буду делать как прийдется?
|
Сообщение от B@rmaley.e><e
|
Как вариант: использовать другой массив для хранения индексов первых элементов каждого ключа. При встрече с ключем проверяем, нет ли у нас его идекса в массиве. Если есть, то прибавляем значения текущего ряда к ряду, полученному по индексу и удаляет текущий ряд, иначе сохраняем индекс.
Проблема лишь в том, что из-за этого образуются "дырки" в массиве, т.е. как-то так:
0 - array
1 - undefined
2 - undefined
3 - array
4 - undefined
|
Спасибо за алгоритм, примерно так я себе это и представлял, просто думал может в js есть более простой вариант .
|
|
01.07.2010, 13:03
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,121
|
|
а мы тут плюшками балуемся
<!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>
|
|
01.07.2010, 16:36
|
Новичок на форуме
|
|
Регистрация: 30.06.2010
Сообщений: 5
|
|
Рони, спасибо!
|
|
|
|