2015-04-02 69 views
-1

我有如下对象的JSON对象:排序包含一个JSON对象对象

{ 
    "166": 
     { 
      "name":{"name":"name","val":"matt","order":""}, 
      "props":{"name":"props","val":"1","order":""} 
     }, 
    "147": 
     { 
      "name":{"name":"name","val":"chris","order":""}, 
      "props":{"name":"props","val":"4","order":""} 
     } 
} 

在JavaScript中,我会怎么排序的道具内的VAL财产此对象的对象?

+4

这不是一个数组... – 2015-04-02 14:44:58

+0

你没有一个数组。你想如何分类这个对象,购买它的属性/键(166,147)?检查[这个答案](http://stackoverflow.com/questions/5467129/sort-javascript-object-by-key)或[this](http://stackoverflow.com/questions/1359761/sorting-a-javascript -object按属性名称)。 – skobaljic 2015-04-02 14:45:08

+1

这是一个对象,而不是一个数组。你不会像那样处理json。 json是一种传输编码格式。你将它解码为本地结构(例如JS对象,PHP数组,等等),然后对其进行排序。然后你重新将已排序的结构重新编码为json。 – 2015-04-02 14:46:19

回答

1

这应该让你接近你想要的。这并不漂亮,但应该指向正确的方向。

var json = 
{ 
    "166": 
    { 
     "name": 
     { 
      "name":"name", 
      "val":"matt", 
      "order":"" 
     }, 
     "props": 
     { 
      "name":"props", 
      "val":"1","order":"" 
     } 
    }, 
    "147": 
    { 
     "name": 
     { 
      "name":"name", 
      "val":"chris", 
      "order":"" 
     }, 
     "props": 
     { 
      "name":"props", 
      "val":"4", 
      "order":"" 
     } 
    } 
}; 

var arr = []; 
for (var jsonProperty in json) { 
    if (json.hasOwnProperty(jsonProperty)) { 
     var propVal = json[jsonProperty]['props']['val']; 
     arr.push({val: propVal, obj: json[jsonProperty]}); 
    } 
} 
var sortedArray = arr.sort(function(a,b){return a.val-b.val}); 
+0

这已经按照我的意愿工作了。非常感谢您的帮助。 – 2015-04-02 15:11:24

1

正如很多评论中提到的那样,您不要“排序”一个对象。排序意味着顺序,意味着一个集合,意味着一个数据结构。

所以首先,你需要一个对象数组。所以通过迭代键将它们提取到数组中。然后使用Array.sort和自定义比较器。

var objectsToSort = { 
    "166": 
     { 
      "name":{"name":"name","val":"matt","order":""}, 
      "props":{"name":"props","val":"1","order":""} 
     }, 
    "147": 
     { 
      "name":{"name":"name","val":"chris","order":""}, 
      "props":{"name":"props","val":"4","order":""} 
     } 
} 

var objects = Object.keys(objectsToSort).map(function (key) { 
    return objectsToSort[key]; 
}); 

objects.sort(function (a, b) { 
    return a.val - b.val; 
}); 

我注意到val是一个数字的字符串表示形式。如果你想有一个数字排序,无论是将其更改为纯整数或更改上面的排序函数使用parseInt

objects.sort(function (a, b) { 
    return parseInt(a.val, 10) - parseInt(b.val, 10); 
}); 

我喜欢改变与函数的实际数据,因为这解析将对每比较两次运行,通常排序N * log(n)。所以它会运行2(N * log(n))。