1

サーバーから取得したデータの配列があります(日付順):

[ {date:"2012-8", name:"Tokyo"}, {date:"2012-3", name:"Beijing"}, {date:"2011-10", name:"New York"} ]

そうしたいです :

  1. 日付が指定された年にある最初の要素の名前を取得します。たとえば、指定された2012が必要ですTokyo
  2. 指定された年を取得するname
  3. の日付を変更するname

これを有効にするには、どのデータ構造を使用すればよいですか?

配列が大きくなる可能性があるため、何かを見つけるために配列をループしないことを好みます

4

3 に答える 3

1

データはおそらく日付の降順で既に並べ替えられているように見えるので、そのデータに対してバイナリ検索を使用して、完全な線形スキャンの実行を回避できます。

日付を変更すると順序が変更されるという明示されていない要件を処理するには、2つの検索を実行する必要があります。これは、上記のようにバイナリ検索である可能性があります。現在のインデックスとそれが存在するはずのインデックスを見つけたら、2つの呼び出しを使用しArray.splice()て、要素を配列内のある場所から別の場所に移動できます。

名前による検索を処理し、それぞれが一意であると想定するにnameは、名前から要素にマップする2次構造を作成する必要があります。

var map = {};
for (var i = 0, n = array.length; i < n; ++i) {
    var name = array[i].name;
    map[name] = array[i];
}

次に、アレイを使用して、map要件2および3に直接対処できます。

map要素は実際には要素への単なる参照であるため、arrayこれらの要素への変更は両方で発生します。

于 2012-08-16T09:06:20.103 に答える
1

一意の都市を使用していると仮定すると、都市名をマップ キーとして使用します。

cities = {
  Tokyo: {
    date: "2012-8" 
  },
  New York: {
    date: "2011-10"
  }
}

日付で検索するには:

function byDate(date) {
  for(el in cities) {
    if(cities.hasOwnProperty(el) && cities[el].date === date)
      return el;
  }
}
于 2012-08-16T09:04:24.097 に答える
1

記録のために: 日付構造を再設計せずに、並べ替えを配列filterまたはmapメソッドと組み合わせて使用​​できます。

function sortByDate(a,b){
   return Number(a.date.replace(/[^\d]+/g,'')) > 
           Number(b.date.replace(/[^\d]+/g,''));
}
var example = [ {date:"2012-8", name:"Tokyo"}, 
                {date:"2012-3", name:"Beijing"}, 
                {date:"2011-10", name:"New York"} ]
              .sort(sortByDate);
//first city with year 2012 (and the lowest month of that year)
var b = example.filter(function(a){return +(a.date.substr(0,4)) === 2012})[0];
b.name; //=> Beijing
//year of a given city
var city = 'Tokyo';
var c = example.filter(function(a){return a.city === city;})[0];
c.year; //=> 2012
//change year of 'New York', and resort data
var city = 'New York', date = '2010-10';
example = example.map(
         function(a){if (a.name === city) {a.date = date;} return a;}
        ).sort(sortByDate);
于 2012-08-16T09:55:40.933 に答える