3

JSON オブジェクト配列があり、そこからいくつかのランダムな値を取得したいと考えています。私は自分でいくつかのコードを書きましたが、最終的には機能しますが、表示するのも醜いです.

それが私がこの質問を始めた理由です。次の状況をコーディングする良い/良い方法は何ですか?

次のような JSON 配列があります (実際にはもっと長くなりますが、例として 2 つだけです)。

"features" : [
    {
      "attributes" : {
        "OBJECTID" : 6, 
        "Type" : "Gebied"
      }
    }, 
    {
      "attributes" : {
        "OBJECTID" : 70, 
        "Type" : "Water"
      }
    }, 
    {
      "attributes" : {
        "OBJECTID" : 80, 
        "Type" : "Water"
      }
    }, 
    {
      "attributes" : {
        "OBJECTID" : 91, 
        "Type" : "Land"
      }
    }, 
    {
      "attributes" : {
        "OBJECTID" : 66, 
        "Type" : "Gebied"
      }
    }, 
    {
      "attributes" : {
        "OBJECTID" : 78, 
        "Type" : "Land"
      }
    }
]

その配列から、次のような新しい単純な配列を作成します。

  • 2つの機能"type" = "Gebied"
  • 1 個の機能"Type" = "Land"

実際には、選択する機能の数 (この例では 1 と 2) は異なる場合があります (1 つのタイプで最大 20)。

そして最も重要なことは、これらの機能をランダムに選択する必要があることです。

皆さんがどのようなアプローチを取るか興味があります。うまくいけば、私が現在使用している (まだ完成していない) ほぼ 100 のコードのルールの代わりに、これを行うための本当に素敵なコード ブロックを作成するのに役立つことを願っています。

4

3 に答える 3

0

ゼロからコーディングするのではなく、アンダースコアなどの利用可能な豊富なライブラリの 1 つを使用します。

var gebied = _.filter(features, function(f) {
  return f.attributes.type === 'Gebied';
});

var result = [];
result.push(gebied[_.random(0, gebied,length)])

これはほんの一部ですが、これがあなたの言いたいことなら、残りは簡単です。

于 2013-05-07T20:42:55.253 に答える
0

これは、この問題に対するより機能的なアプローチであり、DRY 原則に固執し、非常に読みやすく再利用可能なコードを生成するという利点があります。基本的に、フィルターのペアがすべての作業を行います。

function isType(t) { // filter by Type
  return function (el) {
    return el.attributes.Type === t;
  }
}

function chooseR(r) { // filter for choosing r of length
  var found = 0;

  return function (el, idx, arr) {
    // calculate probability to keep [# needed / # left]
    var keep = Math.random() < (r - found) / (arr.length - idx);

    // increment if keeping
    keep && found++;

    return keep;
  }
}

var myGebied = features.filter(isType('Gebied')).filter(chooseR(2)),
    myLand = features.filter(isType('Land')).filter(chooseR(1));

このchooseRアルゴリズムは、Select a random N elements from List への回答のフィルター適応にすぎません。明らかにchooseR(1)ばかげていますが、アプローチの原則を示すためにそのままにしておきました。

IE8 を気にしない場合Array.prototype.filterは、標準の ES5 仕様です (ブラウザのサポートを参照)。それ以外の場合は、そのためのシムをどこかで拾ってください (リンクされている MDN ページの下部にシムがあります)。

于 2013-05-07T22:15:07.273 に答える