[英]Sort array of objects by subarray property value in javascript
I have an array of JavaScript objects: 我有一个JavaScript对象数组:
var people = [
{
"name": "Edward",
"age": 100,
"wallet": {
"location": "home",
"cash": 500
},
"bank": {
"location": "bank street",
"cash": 22100
}
},
{
"name": "Lisa",
"age": 30,
"wallet": {
"location": "home",
"cash": 20
},
"bank": {
"location": "bank street",
"cash": 12340
}
},
{
"name": "Elisabeth",
"age": 50,
"wallet": {
"location": "home",
"cash": 200
},
"bank": {
"location": "bank street",
"cash": 5000
}
}
];
How can I sort them by wallet.cash ? 如何按wallet.cash排序?
This following example (by Ege Özcan) works if I wanted to sort these objects by name, or age, but I have hard time modifying it to work with multidimensional key. 如果我想按名称或年龄对这些对象进行排序,以下示例(由EgeÖzcan撰写)可以工作,但是我很难修改它以使其与多维键配合使用。
function dynamicSort(property) {
var sortOrder = 1;
if(property[0] === "-") {
sortOrder = -1;
property = property.substr(1);
}
return function (a,b) {
var result = (a[property] < b[property]) ? -1 : (a[property] > b[property]) ? 1 : 0;
return result * sortOrder;
}
}
This works: 这有效:
people.sort(dynamicSort("name"));
This doesn't: 这不是:
people.sort(dynamicSort("wallet.cash"));
Thank you in advance! 先感谢您!
You can pass two different arguments to dynamicSort function 您可以将两个不同的参数传递给dynamicSort函数
function dynamicSort(property1,property2) {
var sortOrder = 1;
if(property1[0] === "-") {
sortOrder = -1;
property1 = property1.substr(1);
}
return function (a,b) {
var result = (a[property1][property2] < b[property1][property2]) ? -1 : (a[property1][property2] > b[property1][property2]) ? 1 : 0;
return result * sortOrder;
}
}
And then call 然后打电话
dynamicSort("wallet","cash");
DEMO 演示
var people = [ { "name": "Edward", "age": 100, "wallet": { "location": "home", "cash": 500 }, "bank": { "location": "bank street", "cash": 22100 } }, { "name": "Lisa", "age": 30, "wallet": { "location": "home", "cash": 20 }, "bank": { "location": "bank street", "cash": 12340 } }, { "name": "Elisabeth", "age": 50, "wallet": { "location": "home", "cash": 200 }, "bank": { "location": "bank street", "cash": 5000 } } ]; function dynamicSort(property1,property2) { var sortOrder = 1; if(property1[0] === "-") { sortOrder = -1; property1 = property1.substr(1); } return function (a,b) { var result = (a[property1][property2] < b[property1][property2]) ? -1 : (a[property1][property2] > b[property1][property2]) ? 1 : 0; return result * sortOrder; } } alert(JSON.stringify(people.sort(dynamicSort("wallet","cash"))))
You can use Object.byString
method from this stackoverflow answer and modify your code like this: 您可以从此stackoverflow答案中使用
Object.byString
方法,并按如下所示修改代码:
function dynamicSort(property) {
var sortOrder = 1;
if(property[0] === "-") {
sortOrder = -1;
property = property.substr(1);
}
return function (a,b) {
var avalue = Object.byString(a, property);
var bvalue = Object.byString(b, property);
var result = (avalue < bvalue) ? -1 : (avalue > bvalue) ? 1 : 0;
return result * sortOrder;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.