Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 07.01.2015, 17:06
Интересующийся
Отправить личное сообщение для igorz Посмотреть профиль Найти все сообщения от igorz
 
Регистрация: 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()
Большое спасибо всем за советы.
Ответить с цитированием
  #12 (permalink)  
Старый 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))
Ответить с цитированием
  #13 (permalink)  
Старый 07.01.2015, 19:46
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,493

igorz, так и должно быть. В массивах не бывает пропусков. Возможно вам нужен объект.
__________________
29375, 35
Ответить с цитированием
  #14 (permalink)  
Старый 07.01.2015, 22:10
Интересующийся
Отправить личное сообщение для igorz Посмотреть профиль Найти все сообщения от igorz
 
Регистрация: 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
Ответить с цитированием
  #15 (permalink)  
Старый 08.01.2015, 09:40
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Сообщение от igorz
sql-запрос у меня сформирован так, как оно того требует:
Вы одуреете строить отношения в js-скриптах. Фактически вам придется написать свой SQL.

Люди даже так делают чтобы воспользоваться готовым: создают временную таблицу которую забивают из запросов, а потом с нее уже запрашивают еще раз. Собственно в большинстве сложных запросов драйвер так и поступает - через временную все собирает.

Короче вам правильно написали - делайте сразу такой запрос, который требуют условия. Отсортировать по мелочи, конечно можно, но не туплю (tuple);
Ответить с цитированием
  #16 (permalink)  
Старый 08.01.2015, 09:50
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Сообщение от igorz
/первоначальный массив меняется на такой:
Вы херней занимаетесь. Это не сортировка и даже не группировка, а хрень какая-то. Количество столбцов не может изменяться после сортировки таблицы.

А я еще думаю почему у вас ни разу слово sort не прозвучало. Короче, прекращайте колхозить, есть научные методы сортировки многомерных (условно в js нет таких) массивов - http://stackoverflow.com/questions/3...ensional-array

Короче как вы делаете - так не бывает, это сферический конь в вакууме, так не делают.
Ответить с цитированием
  #17 (permalink)  
Старый 08.01.2015, 13:56
Интересующийся
Отправить личное сообщение для igorz Посмотреть профиль Найти все сообщения от igorz
 
Регистрация: 19.09.2014
Сообщений: 23

Сообщение от kostyanet Посмотреть сообщение
Люди даже так делают чтобы воспользоваться готовым: создают временную таблицу которую забивают из запросов, а потом с нее уже запрашивают еще раз. Собственно в большинстве сложных запросов драйвер так и поступает - через временную все собирает.
Ну ладно, когда делаешь что-то для себя, где можно смериться со всякими костылями и т.д. (это я не к тому что вы написали).
Но я логику представлял так, что
1. Сделал запрос.
2. Обработал данные не стороне клиента + дальнейшие действия.
А по вашему, выходит, что я вместо 1 запроса в бд должен буду сделать N запросов для формирования таблицы (я правильно понял ?)
И вместо, допустим, 1мс на его выполнение, буду ждать 1мс*N. Так действительно принято делать ?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вопрос по toDataURL() GodZiLA Общие вопросы Javascript 0 03.06.2014 17:21
Всплытие событий или что то не так... Кирюха =) jQuery 6 30.03.2013 12:56
Вопрос по each() и перебору строк таблицы battrack jQuery 1 09.02.2012 14:30
вопрос про возможности JS для рисования и анимации macdack Библиотеки/Тулкиты/Фреймворки 3 15.07.2011 00:13
Теоретический вопрос. gods33 (X)HTML/CSS 10 16.12.2010 23:49