Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 07.01.2015, 13:40
Интересующийся
Отправить личное сообщение для igorz Посмотреть профиль Найти все сообщения от igorz
 
Регистрация: 19.09.2014
Сообщений: 23

Вопрос по массиву
Здравствуйте, (не в том разделе тему создал )
Вот какой вопросик появился:
Допустим, у меня есть выборка из бд, которая возвращает мне двумерный массив вида:
var mas = [
["1", "Mike"],
["1", "Mike"],
["2", "John"],
["3", "Bob"],
["1", "Mike"],
["3", "Jim"]
];


Далее, моя задача взять этот массив, и отсортировать его в другой массив по первым цифрам. Я могу это сделать, если я знаю что у меня там всего 3 разных цифры - т.е. 1,2 и 3. Я создаю массив на 3 элемента и начинаю сортировку. Всё нормально - всё срабатывает. Имею в итоге такое:
result = [
[["1", "Mike"], ["1", "Mike"], ["1", "Mike"]], 
[["2", "John"]], 
[["3", "Bob"],["3", "Jim"]]
];


Но вот я не понимаю - как мне быть, если я не буду знать заранее сколько разных цифр мне там прийдёт, и как тогда работать с массивом result заранее не зная его размера
Что-нибудь по типу "динамического" массива ? Но его вроде в js нет. Как можно поступить в данной ситуации ?

Последний раз редактировалось igorz, 07.01.2015 в 13:43.
Ответить с цитированием
  #2 (permalink)  
Старый 07.01.2015, 13:54
Аватар для Safort
Профессор
Отправить личное сообщение для Safort Посмотреть профиль Найти все сообщения от Safort
 
Регистрация: 23.12.2013
Сообщений: 1,856

Вообще-то в JS и есть динамические массивы)
Ответить с цитированием
  #3 (permalink)  
Старый 07.01.2015, 14:04
Аватар для Safort
Профессор
Отправить личное сообщение для Safort Посмотреть профиль Найти все сообщения от Safort
 
Регистрация: 23.12.2013
Сообщений: 1,856

Что мне подсказывает, что так хранить данные - это не круто. Может, тебе лучше хранить в виде свойств объектов?

var result = {
  Mike: { num: '1', length: 3 },
  John: { num: '2', length: 1 },
  Bob:  { num: '3', length: 1 },
  Jim:  { num: '3', length: 1 }
}

alert(result.Mike.num);
alert(result.Mike.length);

Последний раз редактировалось Safort, 07.01.2015 в 14:34.
Ответить с цитированием
  #4 (permalink)  
Старый 07.01.2015, 14:07
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Вобще херня какая-то. Надеюсь эта дикая фигня используется не в публичном сайте, а где нибудь без палева, для себя?
var data = [
    ["1", "Mike"],
    ["1", "Mike"],
    ["2", "John"],
    ["3", "Bob"],
    ["1", "Mike"],
    ["3", "Jim"]
];

var result = data.reduce(function(result, element) {
    var key = element[0];
    result[key] = result[key] || [];
    result[key].push(element);
    return result;
}, []);
console.log(result);
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #5 (permalink)  
Старый 07.01.2015, 15:06
Интересующийся
Отправить личное сообщение для igorz Посмотреть профиль Найти все сообщения от igorz
 
Регистрация: 19.09.2014
Сообщений: 23

Сообщение от danik.js Посмотреть сообщение
Вобще херня какая-то. Надеюсь эта дикая фигня используется не в публичном сайте, а где нибудь без палева, для себя?
Я не спец в js чтоб спорить, но всё же...
Да, для себя, но в чём фигня-то? На сервере отрабатывает php sql запрос, и возвращает мне
$rows = array();
while ($data = mysql_fetch_array($qr_result)) { $rows[] = ... }
print json_encode($rows);

Ответ приходит в ajax
...
success: function (response) {
            mas = JSON.parse(response);
}

В итоге имею тот массив, за который написал в начале.
Потом мне этот массив надо перелопать для того, чтобы построить из него график, используя c3.js либу. Т.е. каждый подмассив это будет отдельная линия, и для каждой я планирую вызывать функцию вроде такой:
// var x1 = ["x1", "1", "2", "3"];
// var data1 = ["data1", "1", "2", "3"];
function draw_graph() {
  chart.load({
    xs: {
      data1 : x1[0], //привязка data1 к х1
    },
    columns: [
      x1,
      data1,
    ],
  });
}
Ответить с цитированием
  #6 (permalink)  
Старый 07.01.2015, 15:37
Интересующийся
Отправить личное сообщение для igorz Посмотреть профиль Найти все сообщения от igorz
 
Регистрация: 19.09.2014
Сообщений: 23

Не судите меня строго за мой индийский код, попробую ещё раз описать

Выше описал то, как я получаю массив. Лишние столбцы поубирал, оставил 2 для наглядности.
var data = [
    ["Name","1"],
    ["Name","2"],
    ["Name","1"],
    ["Name","2"],
    ["Name","1"],
    ["Name","2"],
    ["Name","1"],
    ["Name","2"],
    ["Name","1"],
    ["Name","2"]];

Далее, я, теоретически, знаю что у меня во втором столбце только 2 разных значения, и я продолжаю писать индийский код:
var values = ["1","2"];
var sortedArray = [[],[]];

for (var i = 0; i < data.length; i++) {
      for (var j = 0; j < values.length; j++) {
        if (data[i][1] == values[j]) {
          sortedArray [j][sortedArray[j].length] = data[i];
        }
      }
    }

//смотрю результат
    for (var i = 0; i < sortedArray.length; i++) {
      console.log("i = " + i + ", " + sortedArray[i]);
      console.log();
    }

//i = 0, Name,1,Name,1,Name,1,Name,1,Name,1
//i = 1, Name,2,Name,2,Name,2,Name,2,Name,2

А вот если на N элементов - то как быть с созданием массива, вот этого не знаю.
Я могу, конечно, сделать доп sql запрос, который мне вернёт кол-во этих уникальных values - но может можно как-то без него
Ответить с цитированием
  #7 (permalink)  
Старый 07.01.2015, 16:27
Интересующийся
Отправить личное сообщение для igorz Посмотреть профиль Найти все сообщения от igorz
 
Регистрация: 19.09.2014
Сообщений: 23

Сообщение от Rise Посмотреть сообщение
igorz, так ты изначально формируй sql-запрос и обрабатывай его правильно, а не как попало.
"Выстрел в небо".

sql-запрос у меня сформирован так, как оно того требует:
$sql = "SELECT player.name, monitor.cord, monitor.planet_activity, monitor.moon_activity, monitor.data_activity 
                FROM monitor, player 
                WHERE player.id = monitor.player_id
                AND player.name = '$playerName' 
                AND (STR_TO_DATE(monitor.data_activity, '%d.%m.%Y') BETWEEN '$start' AND '$finish')
                ORDER BY monitor.data_activity ASC";

И дальше как раз и пытаюсь его "обработать", разделив по отдельным массивам результаты по "monitor.cord". Он может быть различным в результате запроса.
Ответить с цитированием
  #8 (permalink)  
Старый 07.01.2015, 16:32
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,577

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, нэ?
__________________
29375, 35

Последний раз редактировалось Aetae, 07.01.2015 в 16:37.
Ответить с цитированием
  #9 (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()
Большое спасибо всем за советы.
Ответить с цитированием
  #10 (permalink)  
Старый 07.01.2015, 19:34
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,105

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))
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вопрос по 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