使用JavaScript按子数组属性值对对象数组进行排序

3

我有一个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
    }
}
];

我该如何按照wallet.cash进行排序?

以下示例(由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;
}
}

这个有效:

people.sort(dynamicSort("name"));

这不起作用:
people.sort(dynamicSort("wallet.cash"));

提前感谢你!

3个回答

2

您可以向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;
}
}

然后调用

dynamicSort("wallet","cash");

演示

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"))))


谢谢,伙计!这正是我在寻找的。然而,第一部分代码缺少属性 -> property1 更改。 - Beeq

0

这里提取此比较函数,您可以执行以下操作:

function compare(a,b) {
  if (a.wallet.cash < b.wallet.cash)
    return -1;
  if (a.wallet.cash > b.wallet.cash)
    return 1;
  return 0;
}

var people = [...];
console.log(people.sort(compare));

0
你可以使用此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;
    }
}

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