07.01.2015, 17:06
|
Интересующийся
|
|
Регистрация: 19.09.2014
Сообщений: 23
|
|
Сообщение от Aetae
|
var data = [
["Name","1"],
["Name","2"],
["Name","1"],
["Name","2"],
["Name","1"],
["Name","2"],
["Name","1"],
["Name","2"],
["Name","1"],
["Name","2"]
];
var sortedArray = [];
for (var i = 0; i < data.length; i++) {
var index = data[i][1] - 1;
if (!sortedArray[index]){
sortedArray[index] = [];
}
sortedArray[index].push(data[i]);
}
console.log(sortedArray)
Только, как намекнули выше, с сервера стоит получать уже в нужном виде, и не городить лишнего.
igorz, может вместо order by использовать group by, нэ?
|
Честно, не пробовал с group by
В приведённом примере небольшой прорех, если вставить 5, то результат выйдет:
var data = [["Name","1"],["Name","2"],["Name","1"],["Name","2"],
["Name","5"],["Name","2"],["Name","1"],["Name","3"],["Name","3"],["Name","2"]];
i = 0, Name,1,Name,1,Name,1
i = 1, Name,2,Name,2,Name,2,Name,2
i = 2, Name,3,Name,3
i = 3, undefined
i = 4, Name,5
Но я понял что могу это доделать так, как нужно через .push()/.pop()
Большое спасибо всем за советы.
|
|
07.01.2015, 19:34
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,070
|
|
igorz,
var mas = [
["1", "Mike"],
["1", "Mike"],
["2", "John"],
["3", "Bob"],
["1", "Mike"],
["3", "Jim"]
];
mas.sort(function(a,b) { return a[0] - b[0]})
var result = [],len = mas.length - 1, n = mas[len][0];
for (var i= len; i > -1; i--) {
if (n != mas[i][0]) {n = mas[i][0]; result.unshift(mas.splice(i+1,mas.length-i+1))} }
result.unshift(mas)
alert(JSON.stringify(result))
var data = [["Name","1"],["Name","2"],["Name","1"],["Name","2"],
["Name","5"],["Name","2"],["Name","1"],["Name","3"],["Name","3"],["Name","2"]];
data.sort(function(a,b) { return a[1] - b[1]})
var result = [],len = data.length - 1, n = data[len][1];
for (var i= len; i > -1; i--) {
if (n != data[i][1]) {n = data[i][1]; result.unshift(data.splice(i+1,data.length-i+1))} }
result.unshift(data)
alert(JSON.stringify(result))
|
|
07.01.2015, 19:46
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,493
|
|
igorz, так и должно быть. В массивах не бывает пропусков. Возможно вам нужен объект.
__________________
29375, 35
|
|
07.01.2015, 22:10
|
Интересующийся
|
|
Регистрация: 19.09.2014
Сообщений: 23
|
|
рони,
Спасибо, обязательно попробую ваш пример
Aetae,
Я понимаю что в массивах не бывает пропусков. Но зачем мне массив б'ольшего размера ?
Сделал свой вариант велосипеда, вроде работает правильно:
var data = [
["Name", "1"],
["Name", "1"],
["Name", "2"],
["Name", "5"],
["Name", "2"]
];
function sortJSONresult(param) {
var saveFlag = 0;
var sortedArray = new Array();
if (param.length > 0) {
sortedArray.push(param[0]);
for (var i = 1; i < param.length; i++) {
for (var j = 0; j < sortedArray.length; j++) {
if ((param[i][1] == sortedArray[j][1]) && (saveFlag != 1)) {
sortedArray[j].push(param[i]);
saveFlag = 1;
} else {
if ((j == (sortedArray.length - 1)) && (saveFlag != 1)) {
sortedArray.push(param[i]);
saveFlag = 1;
}
}
}
saveFlag = 0;
}
}
return sortedArray;
}
var srt = sortJSONresult(data);
//смотрю результат
for (var i = 0; i < srt.length; i++) {
console.log("i = " + i + ", " + srt[i]);
}
//i = 0, Name,1,Name,1
//i = 1, Name,2,Name,2
//i = 2, Name,5
Но меня смущает один момент: sortedArray [i].push(param[i]) - так вообще можно делать ? Оно-то вроде работает... но после такого применения почему-то меняется первоначальный массив, который передаётся в функцию (как так ?)
//первоначальный массив меняется на такой:
i = 0, Name,1,Name,1
i = 1, Name,1
i = 2, Name,2,Name,2
i = 3, Name,5
i = 4, Name,2
//этот на вадаче из функции
i = 0, Name,1,Name,1
i = 1, Name,2,Name,2
i = 2, Name,5
|
|
08.01.2015, 09:40
|
Профессор
|
|
Регистрация: 23.10.2010
Сообщений: 2,718
|
|
Сообщение от igorz
|
sql-запрос у меня сформирован так, как оно того требует:
|
Вы одуреете строить отношения в js-скриптах. Фактически вам придется написать свой SQL.
Люди даже так делают чтобы воспользоваться готовым: создают временную таблицу которую забивают из запросов, а потом с нее уже запрашивают еще раз. Собственно в большинстве сложных запросов драйвер так и поступает - через временную все собирает.
Короче вам правильно написали - делайте сразу такой запрос, который требуют условия. Отсортировать по мелочи, конечно можно, но не туплю (tuple);
|
|
08.01.2015, 09:50
|
Профессор
|
|
Регистрация: 23.10.2010
Сообщений: 2,718
|
|
Сообщение от igorz
|
/первоначальный массив меняется на такой:
|
Вы херней занимаетесь. Это не сортировка и даже не группировка, а хрень какая-то. Количество столбцов не может изменяться после сортировки таблицы.
А я еще думаю почему у вас ни разу слово sort не прозвучало. Короче, прекращайте колхозить, есть научные методы сортировки многомерных (условно в js нет таких) массивов - http://stackoverflow.com/questions/3...ensional-array
Короче как вы делаете - так не бывает, это сферический конь в вакууме, так не делают.
|
|
08.01.2015, 13:56
|
Интересующийся
|
|
Регистрация: 19.09.2014
Сообщений: 23
|
|
Сообщение от kostyanet
|
Люди даже так делают чтобы воспользоваться готовым: создают временную таблицу которую забивают из запросов, а потом с нее уже запрашивают еще раз. Собственно в большинстве сложных запросов драйвер так и поступает - через временную все собирает.
|
Ну ладно, когда делаешь что-то для себя, где можно смериться со всякими костылями и т.д. (это я не к тому что вы написали).
Но я логику представлял так, что
1. Сделал запрос.
2. Обработал данные не стороне клиента + дальнейшие действия.
А по вашему, выходит, что я вместо 1 запроса в бд должен буду сделать N запросов для формирования таблицы (я правильно понял ?)
И вместо, допустим, 1мс на его выполнение, буду ждать 1мс*N. Так действительно принято делать ?
|
|
|
|