javascript - 根据任意长度的属性对 JavaScript 对象数组进行排序

标签 javascript arrays sorting object

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

因此:

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

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

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

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

  • “姓名”
  • “地址.邮政编码”
  • “地址.契约(Contract).时间”

但是,目前我的排序函数必须解码有多少个“.”。通过拆分它,然后我可以根据 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:更正了我的第一个

最佳答案

使用来自 Grouped sorting on a JS arraycmp和来自 Convert string in dot notation to get the object referenceref ;)

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

关于javascript - 根据任意长度的属性对 JavaScript 对象数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16686627/

相关文章:

javascript - 调用 Api 海上交通 javascript

javascript - 过滤函数没有返回正确的值

javascript - 将 2 位数日期转换(格式化)为 4 位数日期

c++ - 结构未完成排序

java - 对自定义对象的 vector 进行排序

javascript - 如何读取客户端机器的IPV4地址?

PHP/mySQL 连接 - 结果中有多个重复行

javascript - 如何根据另一个数组中的相应值对一个数组进行排序?

c++ - C++中的数组初始化

PHP多维数组到单数组按值排序