基于任意长度的属性对JavaScript对象数组进行排序

时间:2013-05-22 08:09:32

标签: javascript arrays sorting object

我有一个JavaScript排序数组函数,它接受我提供的字符串,这是我要排序的属性的名称,它按照该属性名称对我的数组进行排序。

因此:

function sortProp(myArr, prop) {
    return myArray.sort(function (a, b) {
        return a[prop] < b[prop];
    }
}

我想要的是,此sort函数继续获取此字符串,但可以将其读取为任意长度的属性以进行排序;在下面的示例中,这可能更容易解释:

我有一个JavaScript数组对象,它采用以下结构(这只是一个显示我有多级嵌套的例子):

{
    {
        "Name" : "John Smith"
        "Address" : {
            "Line 1" : "123 Some Street"
            "Line 2" : "Some Neighbourhood"
            "Town" : "Some Town"
            "PostCode" : "ST1 1ST"
            "Contract" : {
                "Name" : "CON1"
                "Hours" : 24
            }
        }
    },

    {
        "Name" : "Mary Jones"
        "Address" : {
            "Line 1" : "321 Some Other Street"
            "Line 2" : "Some Other Neighbourhood"
            "Town" : "Some Other Town"
            "PostCode" : "SO1 1OS"
            "Contract" : {
                "Name" : "CON2"
                "Hours" : 48
            }
        }
    }
}

在我的用户界面上,我有一个下拉列表,其中包含此数组中属性的某些值;因此我可能会排序:

  • “名称”
  • “Address.PostCode”
  • “Address.Contract.Hours”

但是,目前我的排序功能必须解码多少'。'有分裂,然后我可以根据arr [prop1]或arr [prop1] [prop2]或arr [prop1] [prop2] [prop3]进行排序,这意味着我必须明确说明我所指的数组深度到。

理想情况下,我想要的是提供字符串,然后函数计算出它需要的嵌套级别 - 但我无法弄清楚如何做到这一点,因为我不确定是否有任何其他方式除了明确说明数组索引。

是否可以实现某些功能,因此我可以通过以下某些方式传递我的排序功能,它可以解决所需的嵌套问题,而无需编写数组深度的硬编码,例如:

sort(myArray, "Name")
sort(myArray, "Address.PostCode")
sort(myArray, "Address.Contract.Hours")
sort(myArray, "Address.Contract.ExampleProp1")
sort(myArray, "Address.Contract.ExampleProp1.ExampleProp2.ExampleProp3")

因此,我可以为它提供任何大小的属性长度的参数,并将其计算出来。

希望有道理:)谢谢。

修改1 :更改了标题

编辑2 :纠正了我的第一个

1 个答案:

答案 0 :(得分:2)

使用Grouped sorting on a JS array中的cmpConvert string in dot notation to get the object reference中的ref;)

prop = "Address.Contract.ExampleProp1"
ary.sort(function(a, b) {
    return cmp(ref(a, prop), ref(b, prop))
})