Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 03.05.2014, 09:27
Интересующийся
Отправить личное сообщение для pshcolnyy Посмотреть профиль Найти все сообщения от pshcolnyy
 
Регистрация: 19.04.2014
Сообщений: 25

метод sort не понимаю.
<html>
  <head>
    <title>YouCube - The Blog for Cube Puzzlers</title>

    <script type="text/javascript">
      // Blog object constructor
      function Blog(body, date) {
        // Assign the properties
        this.body = body;
        this.date = date;
      }

      // Global array of blog entries
      var blog = [ new Blog("Got the new cube I ordered. It's a real pearl.", new Date("08/14/2008")),
                   new Blog("Solved the new cube but of course, now I'm bored and shopping for a new one.", new Date("08/19/2008")),
                   new Blog("Managed to get a headache toiling over the new cube. Gotta nap.", new Date("08/16/2008")),
                   new Blog("Found a 7x7x7 cube for sale online. Yikes! That one could be a beast.", new Date("08/21/2008")) ];

      // Show the list of blog entries
      function showBlog(numEntries) {
        // First sort the blog in reverse chronological order (most recent first)
        blog.sort(function(blog1, blog2) { return blog2.date - blog1.date; });

        // Adjust the number of entries to show the full blog, if necessary
        if (!numEntries)
          numEntries = blog.length;

        // Show the blog entries
        var i = 0, blogText = "";
        while (i < blog.length && i < numEntries) {
          // Use a gray background for every other blog entry
          if (i % 2 == 0)
            blogText += "<p style='background-color:#EEEEEE'>";
          else
            blogText += "<p>";

          // Generate the formatted blog HTML code
          blogText += "<strong>" + (blog[i].date.getMonth() + 1) + "/" +
            blog[i].date.getDate() + "/" +
            blog[i].date.getFullYear() + "</strong><br />" +
            blog[i].body + "</p>";

          i++;
        }

        // Set the blog HTML code on the page
        document.getElementById("blog").innerHTML = blogText;
      }
    </script>
  </head>

  <body onload="showBlog(5);">
    <h3>YouCube - The Blog for Cube Puzzlers</h3>
    <img src="cube.png" alt="YouCube" />
    <div id="blog"></div>
    <input type="button" id="showall" value="Show All Blog Entries" onclick="showBlog();" />
  </body>
</html>



Всем привет. У меня возник вопрос по методу sort вот здесь

blog.sort(function(blog1, blog2) { return blog2.date - blog1.date; });:


Я понимаю что он делает (сортирует даты по убыванию), но я не понимаю как он это делает. Во первый, что еще за blog1 и blog2 ,что это такое и каким макаром отнимая blog2.date от blog1.date массив сортируется по убыванию, если следовать моей логике результатом такого действия должно быть число, а точнее разница между первой второй датой и первой в миллисекундах.

Всем заранее благодарен за помощь.
Ответить с цитированием
  #2 (permalink)  
Старый 03.05.2014, 09:42
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,089

pshcolnyy,
может документацию почитать?
Цитата:
Алгоритм сортировки, встроенный в JavaScript, будет передавать ей для сравнения элементы массива. Она должна возвращать:
Положительное значение, если a > b,
Отрицательное значение, если a < b,
Если равны — не важно, что возвращать, их взаимный порядок не имеет значения.
blog1 и blog2 -- название может быть любым - a и b например.
http://learn.javascript.ru/array-met...тировки
Ответить с цитированием
  #3 (permalink)  
Старый 03.05.2014, 10:48
Интересующийся
Отправить личное сообщение для pshcolnyy Посмотреть профиль Найти все сообщения от pshcolnyy
 
Регистрация: 19.04.2014
Сообщений: 25

так что значит это вычетание, и зачем мне это положительное значение, отрицательное если мне только нужно отсортировать значения по убыванию.

Хорошо вот код:

function compareNumeric(a, b) {
  if (a > b) return 1;
  if (a < b) return -1;
}
 
var arr = [ 1, 2, 15 ];
 
arr.sort(compareNumeric);
 
alert(arr);  // 1, 2, 15



он берет 2 значения из массива и сравнивает их если a>b возвращает 1, если наоборот возвращает -1 и как мне это понимать, что мне делать с этими 1 и -1


и это еще не все как из этого выходит это
function compareNumeric(a, b) {
  return a - b;
}
Ответить с цитированием
  #4 (permalink)  
Старый 03.05.2014, 11:31
Профессор
Отправить личное сообщение для jsnb Посмотреть профиль Найти все сообщения от jsnb
 
Регистрация: 15.03.2014
Сообщений: 561

Сообщение от pshcolnyy Посмотреть сообщение
он берет 2 значения из массива и сравнивает их если a>b возвращает 1, если наоборот возвращает -1 и как мне это понимать, что мне делать с этими 1 и -1
Ничего тебе с ними делать не надо. sort сам всё сделает. Ему просто указать надо что больше, а что меньше и то что меньше оно поставит левее в массиве, то что больше правее. Если функция вернет положительное число, то sort считает что a>b, если отрицательное, что a<b и сортирует в соответствии с этим.

Сообщение от pshcolnyy Посмотреть сообщение
и это еще не все как из этого выходит это
function compareNumeric(a, b) {
return a - b;
}
Простая арифметика: если a<b то разность a-b будет отрицательной, если a>b, то наоборот.
Ответить с цитированием
  #5 (permalink)  
Старый 03.05.2014, 20:54
Интересующийся
Отправить личное сообщение для pshcolnyy Посмотреть профиль Найти все сообщения от pshcolnyy
 
Регистрация: 19.04.2014
Сообщений: 25

Я все равно не понимаю как изменять сортировку .

Вы написали:
Ему просто указать надо что больше, а что меньше и то что меньше оно поставит левее в массиве, то что больше правее.

И как это указывается.
Ответить с цитированием
  #6 (permalink)  
Старый 03.05.2014, 21:15
Аватар для Dim@
Профессор
Отправить личное сообщение для Dim@ Посмотреть профиль Найти все сообщения от Dim@
 
Регистрация: 21.04.2012
Сообщений: 951

просто через условие, например: сначала должны быть строки у которых есть цифры, а потом те у которых их нет
var arr = ["здесь нет цифр","пусто","123","текст с цифрой 1"," 12 людей","    "];
alert(arr);
arr.sort(function (a){return /[0-9]/g.test(a) ? -1 : 1}); // сортировка - становим в начало строки в которых есть какие-либо цифры
alert(arr);
Ответить с цитированием
  #7 (permalink)  
Старый 03.05.2014, 21:52
Интересующийся
Отправить личное сообщение для pshcolnyy Посмотреть профиль Найти все сообщения от pshcolnyy
 
Регистрация: 19.04.2014
Сообщений: 25

я еще то не понял а ты мне такое даешь.


вот функция sort:
function compare(x,y) {
return x-y;
}

у меня в книге написано что если значение будет больше нуля то ставиться y перед x , если меньше 0 то x перед y.


После выдачи таких фактов ничего не объяснив они меняют функции вместо x - y
они ставят y-x т.к нам требуется в программе упорядочить числа по убыванию.

Отсюда вопрос вот если значение будет больше нуля то они меняются местами, так всегда или этот факт можно изменить

Если так всегда то я начинаю понимать как это работает, точнее принцип работы, то есть пофиг что ты там напишешь все решает результат -1 +1 или 0, в зависимости от этого результата массив перестраивается.
Ответить с цитированием
  #8 (permalink)  
Старый 03.05.2014, 22:32
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,531

Сообщение от pshcolnyy Посмотреть сообщение
то есть пофиг что ты там напишешь все решает результат -1 +1 или 0, в зависимости от этого результата массив перестраивается.
Именно.
Указывая -1 ты говоришь, что первое значение после сортировки должно быть левее, а второе правее.
Указывая 1 говоришь, что первое значение после сортировки должно быть правее, а второе левее.
Указывая 0 говоришь, что ничего двигать не надо.

Функция же производящая сортировку работает самостоятельно исходя из этих указании.
__________________
29375, 35
Ответить с цитированием
  #9 (permalink)  
Старый 04.05.2014, 04:38
Профессор
Отправить личное сообщение для jsnb Посмотреть профиль Найти все сообщения от jsnb
 
Регистрация: 15.03.2014
Сообщений: 561

Сообщение от pshcolnyy Посмотреть сообщение
Вы написали:
Ему просто указать надо что больше, а что меньше и то что меньше оно поставит левее в массиве, то что больше правее.

И как это указывается.
Я же там дальше написал как это указывается:
Сообщение от jsnb Посмотреть сообщение
Если функция вернет положительное число, то sort считает что a>b, если отрицательное, что a<b и сортирует в соответствии с этим.


Сообщение от pshcolnyy Посмотреть сообщение
Если так всегда то я начинаю понимать как это работает, точнее принцип работы, то есть пофиг что ты там напишешь все решает результат -1 +1 или 0, в зависимости от этого результата массив перестраивается.
Ну так тебе про это уже несколько раз написали. Да, для sort важно только возвращаемое из функции число, а точнее его знак. Это может быть как -1 и 1, так и -123213 и 432, на само число sort плевать, оно ориентируется по знаку числа. Поэтому там и написано return a-b, т.к. тут простые арифметические правила заменяют "if (a<b) return -1" т.к. если a<b, то a-b будет отрицательным числом и оно попадет в return.

Последний раз редактировалось jsnb, 05.05.2014 в 05:23.
Ответить с цитированием
  #10 (permalink)  
Старый 05.05.2014, 09:09
Интересующийся
Отправить личное сообщение для pshcolnyy Посмотреть профиль Найти все сообщения от pshcolnyy
 
Регистрация: 19.04.2014
Сообщений: 25

спасибо
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Кастомный метод для элемента выборки. Casufi jQuery 7 26.09.2013 18:43
про метод sort() Иваннн Элементы интерфейса 30 18.11.2012 15:46
Объект не поддерживает это свойство или метод load_081112_0953.js 1auto1 Internet Explorer 1 13.04.2011 21:59
Как узнать у какого объекта вызван метод. Scalar Events/DOM/Window 4 26.03.2010 11:10
Добавить свой метод к элементу alekciy Events/DOM/Window 6 16.02.2009 19:29