如何通过嵌套对象属性对对象的解析JS数据进行排序

时间:2012-03-20 11:32:33

标签: javascript jquery ajax sorting

我尝试通过使用嵌套对象属性(属性为“得分”)以数字的形式按数字顺序对对象进行排序。

数组;

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

我找到了以下主题,但还是设法让它运转起来。

How to sort a JavaScript array of objects by nested object property?

控制台输出未定义。

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请求的数据。

提前谢谢, 凸轮

2 个答案:

答案 0 :(得分:2)

你好吗?

我刚试过这个,你可能想要修改一些东西。

首先,您使用的是来自提问者的“排序”解决方案,而不是实际解决方案,因此您首先需要重写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;
        };

分析这个函数,我添加了第三个“反向”参数,它要求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);

<强>第二

另外,请记住,您输出的是“returnedData”值而不是ordered_scores值,所以如果这行:

console.log(returnedData);

输出未定义,表示您的JSON数据不正确。为确保排序有效,您还应该输出ordered_scores,如下所示:

console.log(ordered_scores);

如果有任何不清楚的地方,请告诉我。

干杯!

答案 1 :(得分:0)

我不确定这是正确的代码:

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;
             }
        });
}

您可以在控制台

中查看输出here