3

私が提供する文字列を受け取る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
            }
        }
    }
}

私のユーザー インターフェイスには、この配列のプロパティに対する特定の値のドロップダウンがあります。したがって、次のように並べ替えることができます。

  • "名前"
  • 「住所.郵便番号」
  • 「住所.契約.時間」

ただし、現時点では、並べ替え関数は「。」の数をデコードする必要があります。それを分割することで、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:私の最初の修正

4

1 に答える 1

2

オブジェクト参照を取得するには、JS 配列のグループ化された並べ替えおよびドット表記の文字列の変換からcmp使用します;)ref

prop = "Address.Contract.ExampleProp1"
ary.sort(function(a, b) {
    return cmp(ref(a, prop), ref(b, prop))
})
于 2013-05-22T08:19:08.203 に答える