2013-11-20 111 views
0

我想订购一个对象,我从JSON“转换”。 我想要使用此功能,我在this question发现,但它似乎并没有在我的情况下工作:排序对象

function sortJsonArrayByProperty(objArray, prop, direction){ 
    if (arguments.length<2) throw new Error("sortJsonArrayByProp requires 2 arguments"); 
    var direct = arguments.length>2 ? arguments[2] : 1; //Default to ascending 

    if (objArray && objArray.constructor===Array){ 
     var propPath = (prop.constructor===Array) ? prop : prop.split("."); 
     objArray.sort(function(a,b){ 
      for (var p in propPath){ 
       if (a[propPath[p]] && b[propPath[p]]){ 
        a = a[propPath[p]]; 
        b = b[propPath[p]]; 
       } 
      } 
      // convert numeric strings to integers 
      a = a.match(/^\d+$/) ? +a : a; 
      b = b.match(/^\d+$/) ? +b : b; 
      return ((a < b) ? -1*direct : ((a > b) ? 1*direct : 0)); 
     }); 
    } 
} 

这里是我的JsFiddle

我想它在3个不同的排序方法:

  • 按时间顺序字典(使用 “时间” 字段)
  • 通过字典
  • 字母(使用 “术语” 场“)
  • 所有按时间顺序排列(忽略字典分隔)

如果这个对象不是如此嵌套,我会知道该怎么做。我能适应这个功能吗?

+0

而不是整个对象传递给'sortJsonArrayByProperty'的,独立通过每个'terms'阵列。只有最后一种方法,你必须将两个数组组合在一起。 –

+0

请备份,而不是发布你找到并尝试过的一段代码,描述你实际想要解决的问题。告诉我们你的数据是什么样的,你想要什么样的排序输出。这是我们能够正确帮助您的唯一方式。而且,请在您的实际问题中发布该信息,而不是在jsFiddle中。在查看jsFiddle中的数据时,由于存在多个数组,因此尚不清楚您想要排序的数据。 – jfriend00

+0

在小提琴中有一个obj的副本。 – Andy

回答

1

你还没有解释你想要的输出,所以这里是基于你的jsFiddle中的数据的逻辑猜测。

OK,这里有以简单易懂的形式从您的jsfiddle数据:

var obj = {saved: [ 
    {"dict":"English","terms": [ 
     {"term":"car","rowId":"3487","time":"1384773838069"}, 
     {"term":"dog","rowId":"443","time":"1384776129957"}, 
     {"term":"plane","rowId":"16171","time":"1384776168253"}, 
     {"term":"bread","rowId":"127564","time":"1384959605196"}] 
    }, 
    {"dict":"French","terms": [ 
     {"term":"Monsieur","rowId":"934","time":"1384862250130"}, 
     {"term":"Croissant","rowId":"13612","time":"1384900161187"}, 
     {"term":"suis","rowId":"942","time":"1384900437068"}] 
     } 
    ] 
}; 

我假设你想每一个条款阵列在它的领域之一,分别排序。

这里是你如何可以通过现场对其进行排序:

// utility function for sorting an array by a key in alpha order 
function sortArrayAlpha(arr, key) { 
    arr.sort(function(a, b) { 
     return a[key].localeCompare(b[key]); 
    }); 
} 

// utility function for sorting an array by a key in parsed numeric order 
function sortArrayNum(arr, key) { 
    arr.sort(function(a, b) { 
     return parseInt(a[key], 10) - parseInt(b[key], 10); 
    }); 
} 

// sort by term 
var dicts = obj.saved; 
// cycle through each item in the saved array 
for (var i = 0; i < dicts.length; i++) { 
    var terms = dicts[i].terms; 
    sortArrayAlpha(terms, "term"); 
} 

// sort by time 
// cycle through each item in the saved array 
for (var i = 0; i < dicts.length; i++) { 
    var terms = dicts[i].terms; 
    sortArrayNum(terms, "time"); 
} 

// sort by rowId 
// cycle through each item in the saved array 
for (var i = 0; i < dicts.length; i++) { 
    var terms = dicts[i].terms; 
    sortArrayNum(terms, "rowId"); 
} 

而且,一个的jsfiddle显示输出:http://jsfiddle.net/jfriend00/vH8u7/。你可以在jsFiddle中看到每种排序的确切输出格式。

这里是什么样的长期的样子:

{"saved":[ 
    {"dict":"English","terms":[ 
     {"term":"bread","rowId":"127564","time":"1384959605196"}, 
     {"term":"car","rowId":"3487","time":"1384773838069"}, 
     {"term":"dog","rowId":"443","time":"1384776129957"}, 
     {"term":"plane","rowId":"16171","time":"1384776168253"}]}, 
    {"dict":"French","terms":[ 
     {"term":"Croissant","rowId":"13612","time":"1384900161187"}, 
     {"term":"Monsieur","rowId":"934","time":"1384862250130"}, 
     {"term":"suis","rowId":"942","time":"1384900437068"}] 
    } 
]}