Câu hỏi thú vị ... Một giải pháp JavaScript đơn giản là tạo chỉ mục cho các đối tượng của bạn trong một mảng riêng biệt, dựa trên thuộc tính 'Surname'
. Một cái gì đó như thế này :
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);
});
Bây giờ bạn sẽ có thể để lặp qua index
mảng của bạn:
for (var i = 0; i < index.length; i++) {
console.log(peopleobj[index[i]['key']]['Surname']);
}
quả (Tested trong Firebug console):
Bunter
Dyson
Mainwaring
Peterson
Bạn có thể muốn kết hợp nó thành một số đối tượng Iterator có thể sử dụng lại được, mặc dù sẽ rất khó để có được như terse như 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;
};
Sau đó, sử dụng nó như sau:
// 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']);
}
Kết quả:
Bunter Billy
Dyson Jeremy
Mainwaring Barry
Peterson Harry
Bạn có thể muốn sử dụng phương pháp hasOwnProperty()
để đảm bảo rằng các tài sản thuộc về đối tượng của bạn và không được kế thừa từ Object.prototype
:
for (var x in peopleobj) {
if (peopleobj.hasOwnProperty(x)) {
index.push({ 'key': x, 'Surname': peopleobj[x]['Surname'] });
}
}
Rất cám ơn Daniel - điều đó thực sự hữu ích! – Jonah
Chỉ cần một chi tiết: điều đó không được gọi là một đối tượng JSON, mà là một đối tượng JavaScript; JSON chỉ là một ký hiệu của một đối tượng JavaScript. –
Cảm ơn bạn đã làm rõ, được đánh giá cao. Ghi nhận hợp lệ! – Jonah