1

私はデータベースに保存されているいくつかのデータから作成したこの配列を持っています:

var chdata = [
  {title: "title one",link: "link one",thumb: "image url one",pcaid: "0001"},
  {title: "title two",link: "link two",thumb: "image url two",pcaid: "0002"},
  {title: "title three",link: "link three",thumb: "image url three",pcaid: "0003"},
  {title: "title four",link: "link four",thumb: "image url four",pcaid: "0004"}
];

次に、次の形式で到着するジオコーディングサービスからいくつかの位置データをプルバックします。

var pcdata = [
  {Distance: "12.2",Latitude: "50.1",Longitude: "0.1",YourID:"0003"},
  {Distance: "80.7",Latitude: "50.4",Longitude: "0.5",YourID:"0001"},
  {Distance: "95.3",Latitude: "50.9",Longitude: "0.7",YourID:"0004"},
  {Distance: "135.1",Latitude: "51.3",Longitude: "0.9",YourID:"0002"},
]

chdataの「pcaid」とpcdataの「YourID」は、DBAの例えを言い訳にすると、2つの配列を関連付ける外部キーです。

chdata配列を介して「each()」を実行し、そこからのデータと、pcdata内の関連アイテムの距離を表示する必要があります。たとえば、擬似コードの場合:

<a href="link one">
  <img src="image url one" /><br />title one (80.7 miles away)
</a>

このデータは距離順にする必要があります。私の質問は次のとおりです。

  1. との間の一致に基づいて、どのように関連付け/交差chdataしますか。pcdatapcaidYourID
  2. これが完了したら、array.sortを使用して距離順に並べ替える予定です。これに問題があると思いますか。
4

2 に答える 2

2

#1の場合: ここでの最適な設定pcdataは、Key-Valueデータ形式にすることです。それを呼びますpchash。次に、この(比較的)単純な構文を使用できます。

for(var i = 0; i < chdata.length; ++i)
{
    var ch   = chdata[i];
    var dist = pchash[ch.pcaid].distance;
    // Other stuff...
}

現在をに移行するpcdataには、次のpchashようなものを使用できます。

pchash = {};
for(var i = 0; i < pcdata.length; ++i)
{
    pchash[pcdata[i]['YourID']] = pcdata[i];
}

または、さらに良いことに、サーバーを制御している場合は、pcdata最初にその形式で送信しました。

#2の場合: JavaScript配列にはソート機能が組み込まれており、カスタムソート用のコンパレーターを渡すことができます。あなたの場合、試してみてください:

whatever.sort(function(a, b) {
    return a.Distance - b.Distance;
});

それがあなたが望むものの逆をあなたに与えるならば、代わりに単に引き算a.Distanceしてください。b.Distance

お役に立てば幸いです。

PS: 別の答えは、ネストされたループでこれをブルートフォースすることを示唆しています。大量のデータがある場合は、お勧めしません。chdata.length * pcdata.length反復が必要ですが、反復のみが必要ですchdata.length + pcdata.length(またはchdata.length、サーバーからKey-Value形式を取得する場合は単に)。ただし、小さなデータセットでは、違いは目立ちません。

于 2012-10-16T10:31:52.347 に答える
1

次を使用してオブジェクトをマージできますextend

$.each(chdata, function(i, x) {
  $.each(pcdata, function(j, y) {
    if(x.pcaid === y.YourID) {

      // at this point you have a match, so you could 
      // either extend the object (like below) 
      $.extend(x, y);

      // just access the properties of each object directly, eg:
      alert(x.title + ' is ' + y.Distance + ' miles away');

    }
  });
});

したがってchdata、ループオーバーしてからループオーバーして、一致pcdataする場所を見つけてから、オブジェクトをマージするか(からの対応するデータを含む)、またはそれらのプロパティに直接アクセスします。pcaidYourIDchdatapcdata

これがフィドルです

于 2012-10-16T10:24:09.343 に答える