有趣的問題...一個普通的JavaScript解決方案是基於'Surname'
屬性在單獨的數組中創建對象的索引。事情是這樣的:
var peopleobj = {
"0291" : { "Forename" : "Jeremy", "Surname" : "Dyson" },
"0398" : { "Forename" : "Billy", "Surname" : "Bunter" },
"6714" : { "Forename" : "Harry", "Surname" : "Peterson" },
"9080" : { "Forename" : "Barry", "Surname" : "Mainwaring" }
};
var index = [];
// build the index
for (var x in peopleobj) {
index.push({ 'key': x, 'Surname': peopleobj[x]['Surname'] });
}
// sort the index
index.sort(function (a, b) {
var as = a['Surname'],
bs = b['Surname'];
return as == bs ? 0 : (as > bs ? 1 : -1);
});
現在你就可以在你的index
數組遍歷:
for (var i = 0; i < index.length; i++) {
console.log(peopleobj[index[i]['key']]['Surname']);
}
結果(在Firebug控制檯測試):
Bunter
Dyson
Mainwaring
Peterson
您可能想要將其包裝成某種可重用的Iterator對象,儘管它很難像Perl那樣簡潔:
// Our reusable Iterator class:
function MyIterator (o, key) {
this.index = [];
this.i = 0;
this.o = o;
for (var x in o) {
this.index.push({ 'key': x, 'order': o[x][key] });
}
this.index.sort(function (a, b) {
var as = a['order'],
bs = b['order'];
return as == bs ? 0 : (as > bs ? 1 : -1);
});
this.len = this.index.length;
}
MyIterator.prototype.next = function() {
return this.i < this.len ?
this.o[this.index[this.i++]['key']] :
null;
};
然後按如下方式使用它:
// Our JavaScript object:
var peopleobj = {
"0291" : { "Forename" : "Jeremy", "Surname" : "Dyson" },
"0398" : { "Forename" : "Billy", "Surname" : "Bunter" },
"6714" : { "Forename" : "Harry", "Surname" : "Peterson" },
"9080" : { "Forename" : "Barry", "Surname" : "Mainwaring" }
};
// Build the Iterator object, using the 'Surname' field:
var surnameIter = new MyIterator(peopleobj, 'Surname');
// Iterate:
var i;
while (i = surnameIter.next()) {
console.log(i['Surname'] + ' ' + i['Forename']);
}
結果:
Bunter Billy
Dyson Jeremy
Mainwaring Barry
Peterson Harry
您可能需要使用hasOwnProperty()
方法,以確保財產屬於您的對象,而不是從Object.prototype
繼承:
for (var x in peopleobj) {
if (peopleobj.hasOwnProperty(x)) {
index.push({ 'key': x, 'Surname': peopleobj[x]['Surname'] });
}
}
非常感謝丹尼爾 - 這真的很有用! – Jonah 2010-10-28 11:09:09
只是一個細節:那個東西不叫做JSON對象,而是一個JavaScript對象; JSON只是一個JavaScript對象的符號。 – 2010-10-28 12:42:14
感謝您的澄清,非常感謝。正式注意! – Jonah 2010-11-03 10:08:45