使用 jQuery 对 JSON 进行排序

5

如何按照名字(first_name)排序这个JSON对象?

{
    1  :{user_id:1, first_name:"first_name1", last_name:"lastname1", email:"user1@test.com"},
    7  :{user_id:7, first_name:"user2", last_name:"test2", email:""}, 
    72 :{user_id:72, first_name:"testing343", last_name:"", email:""},
    246:{user_id:246, first_name:"aaa", last_name:"ssss", email:""}
}

1
对象属性没有顺序,因此无法对它们进行排序。 - Musa
@Musa:当然可以。虽然不能直接排序键名,但你肯定可以按顺序执行某些操作。 - jAndy
这些都没有对你有所帮助吗?链接 - Felix Kling
1
请参见:JQuery:按属性排序JSON - Hugolpz
3个回答

4

首先,你的 JSON字符串 是无效的。请先解决这个问题,否则你只能在当前形式下使用 eval() ,而不能使用 JSON.parse()


根据规范,对象键是无序的。你不能静态地"排序"键名并将它们固定在对象中。但你可以对键名进行排序,并按照它们的值进行操作。

例如:

var json = '{1:{user_id:1, first_name:"first_name1", last_name:"lastname1", email:"user1@test.com"}, 7:{user_id:7, first_name:"user2", last_name:"test2", email:""}, 72:{user_id:72, first_name:"testing343", last_name:"", email:""}, 246:{user_id:246, first_name:"aaa", last_name:"ssss", email:""}}';

json = eval( json );

Object.keys( json ).sort(function( a,b ) {
    return json[a].first_name.localeCompare( json[b].first_name );
}).forEach(function( key ) {
    console.log( json[key].first_name );
});

这段代码假设存在一个支持ES5的JS引擎或任何ES5-shim库。


脚本正在正确地排序和显示用户。有没有一种方法可以永久地对它们进行排序?我的意思是覆盖先前的JSON文件? - Shounak Gupte
@JSnewbie:不,不是真的。当然你可以创建一个丑陋而笨重的冻结 json字符串,但那对你没有帮助。一旦你将其 evalparse 成 ECMAscript 对象,键名又是随机的了。你唯一的选择就是“实时”排序,并按顺序操作键/值。 - jAndy

3

按照以下方式编写您的JSON对象:

data = [{user_id:1, first_name:"first_name1", last_name:"lastname1", email:"user1@test.com"}, {user_id:7, first_name:"user2", last_name:"test2", email:""}, {user_id:72, first_name:"testing343", last_name:"", email:""}, {user_id:246, first_name:"aaa", last_name:"ssss", email:""}]

现在它是一个数组。然后您可以对其调用.sort()

data.sort(function(a, b) {
    var x = a.first_name.toLowerCase(), y = b.first_name.toLowerCase();
    return x < y ? -1 : x > y ? 1 : 0;
});

0

为什么要对一个对象进行排序?

您可能需要将此对象循环到数组中,然后对该数组进行排序。http://jsfiddle.net/z2xsC/ 例如:

//loop into array
var arr = [];
for( var key in data ){
  if( data.hasOwnProperty( key ) ){
    arr.push( data[key] );
  }
}

//now, sort your array
arr.sort( function(a,b) { 
  var nameA=a.first_name.toLowerCase(),
      nameB=b.first_name.toLowerCase();

  if (nameA < nameB){ 
    return -1; 
  } else if (nameA > nameB){ 
    return 1
  } else { 
    return 0
  }
});

排序算法看起来过于复杂,String.prototype.localeCompare 可以胜任。 - jAndy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接