как отсортировать проанализированные данные JS объектов по вложенному объекту - PullRequest
1 голос
/ 20 марта 2012

Я пытаюсь упорядочить объекты по порядку в массиве в порядке возрастания, используя свойство вложенного объекта со свойством «оценка».

Массив;

[ {name:'dan', score:220},
  {name:'lucy', score:876},
  {name:'mike', score:211} ]

Я нашел следующую ветку, но пока не смог заставить ее работать.

Как отсортировать массив объектов JavaScript по свойству вложенного объекта?

Консольные выходы не определены.

function order_top_scores(prop, arr) {
    arr.sort(function (a, b) {
         if (a[prop] < b[prop]) {
        return -1;
         } else if (a[prop] > b[prop]) {
        return 1;
         } else {
        return 0;
         }
    });
};

function get_results(){
    $.get(wp_theme_dir+'/dottodot.php', 
         function(data){ 
        var returnedData = $.parseJSON(data);
        var ordered_scores = order_top_scores(returnedData)     
        console.log(returnedData);

    });
}

Мой массив немного отличается, может ли это быть вторым свойством, нарушающим сортировку? Или, может быть, способ обработки данных из запроса AJAX.

спасибо заранее, Cam

Ответы [ 2 ]

2 голосов
/ 20 марта 2012

Как дела?

Я только что проверил это, и есть пара вещей, которые вы можете изменить.

Прежде всего, вы используете "сортировку"решение от человека, который спросил, а не фактическое решение, поэтому вам сначала нужно переписать ваши order_top_scores, например:

        var order_top_scores = function (prop, arr,reverse) {
            if(!reverse) reverse = 0;
            prop = prop.split('.');
            var len = prop.length;

            arr.sort(function (a, b) {
                var i = 0;
                while( i < len ) { a = a[prop[i]]; b = b[prop[i]]; i++; }
                if (a < b) {
                    return -1;
                } else if (a > b) {
                    return 1;
                } else {
                    return 0;
                }
            });

            if(reverse){arr.reverse()};
            return arr;
        };

Анализируя эту функцию, я добавил третий параметр "reverse", который ожидаетлибо true, либо false (потому что исходное решение упорядочивает его от низшего к высшему, и в этом случае вы хотите обратное)

Теперь, когда у вас есть эта функция, есть две вещи, которые вы хотите иметь в виду:

Первый

В этой строке:

var ordered_scores = order_top_scores(returnedData);

Вы не отправляете первый обязательный параметр, который фактически сообщает функции, какое свойство вы хотите получить для объектаотсортировано по: В данном случае, «оценка».

Итак, вы должны вызвать функцию следующим образом:

var ordered_scores = order_top_scores('score',returnedData);

И если вы хотите, чтобы она была отсортирована от высокой к низкой,как это:

var ordered_scores = order_top_scores('score',returnedData,true);

Второй

Кроме того, имейте в виду, что вы выводите значение «returnData», а не значение order_scores, поэтому, если эта строка:

console.log(returnedData);

выводит неопределенное значение, это означает, что ваши данные JSON неверны,Чтобы убедиться, что сортировка работает, вы должны также вывести order_scores следующим образом:

console.log(ordered_scores);

Дайте мне знать, если что-то неясно.

Cheers!

0 голосов
/ 20 марта 2012

Я не уверен, что это правильный код:

var returnedData = $.parseJSON(data);
var ordered_scores = order_top_scores(returnedData)

Следующее изменение в order_top_scores и вызов метода могут работать правильно, если returnedData - массив, как вы упомянули в своем вопросе:

function get_results(){
    $.get(wp_theme_dir+'/dottodot.php', 
         function(data){ 
        var returnedData = $.parseJSON(data);
        var ordered_scores = order_top_scores("score", returnedData); 
        console.log(returnedData);

    });
}

function order_top_scores(prop, arr) {
    arr.sort(function (a, b) {
             if (a[prop] < b[prop]) {
            return -1;
             } else if (a[prop] > b[prop]) {
            return 1;
             } else {
            return 0;
             }
        });
}

Вы можете проверить вывод здесь в консоли

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...