2

JavaScript でマップまたは辞書スタイルのデータ構造を作成しようとしています。各文字列キーは int の配列を指しています。キーが指している配列を使っていくつかの簡単なことをしたいと思います。

私はたくさんの動物を飼っており、それぞれに ID (1,2,3,...) が付いています。これらをマップに入れたいので、1、4、5 が猫で、2、3、6 が犬であることがわかります。

これをよりよく説明するためのコードを次に示します。

var myMap = {};
myMap["cats"] = new Array(1,4,5);   //animals 1,4,5 are cats
myMap["dogs"] = new Array(2,3,6);   //animals 2,3,6 are dogs  

1) 配列に何かを追加するにはどうすればよいですか? たとえば、動物 #7 が猫の場合、次のコードは正しいでしょうか?

myMap["cats"].push(7);   //so that myMap["cats"] is now an array with [1,4,5,7]

2)キーが配列内のアイテムの数で順序付けられるようにマップをソートするにはどうすればよいですか? この場合、myMap["cats"] は myMap["dogs"] の前になります。これは、"cats" の配列が "dogs" の配列よりも多くのアイテムを持っているためです。次のコードは正しいでしょうか?

myMap.sort(function(a,b){return myMap[b].length - myMap[a].length});

JavaScript でこれを行うより効率的な方法がある場合は、お知らせください。どうもありがとう!

4

3 に答える 3

8

あなた自身の最初の質問に答えたようです。


2 番目の質問については、マップ キーの並べ替え順序を維持するために、別の配列が必要になります。

var mapKeys = Object.keys(myMap);

mapKeys.sort(function(a,b){return myMap[b].length - myMap[a].length});

次に、を繰り返してmapKeys、並べ替えられた順序でコレクションを取得できます。

mapKeys.forEach(function(key) {
    console.log("Processing ", key);
    var indices = myMap[key];
});
于 2013-05-10T01:42:31.070 に答える
3

1) はい、push動作します (unshiftまたはのようにsplice)。

2)オブジェクトキーは本質的に順序付けされていないため、sort関数はありません:-)マップに関数を追加して、ソートされた順序で値を返すことができます:

myMap.sort = function sortMap(sortFunc) {
    var results = [];
    for (key in this) {
        if (this.hasOwnProperty(key) && this[key] !== sortMap) {
            results.push(this[key]);
        }
    }
    return results.sort(sortFunc);
};

myMap.sort(function(a, b) { return a.length - b.length; });

いくつかのメモ:

  • 必要でない限り (たとえば、11 個のダッシュの文字列を作成する場合) Array、orを使用しないでください。代わりに、配列リテラル構文を使用してください。より明確です (そして、ほとんどのブラウザーでは実際に高速です)。new ArrayArray(12).join("-")[]
  • 疑問がある場合は、ブラウザで MDN とコンソールを開いて試してみてください。
于 2013-05-10T01:41:33.793 に答える
1

キーが配列内のアイテムの数で順序付けられるようにマップを並べ替えるにはどうすればよいですか?

{ 'cats': [1,4,5], 'dogs': [2,3,6] }マップは順序付けされていません。 と の間に違いはありません{ 'dogs': [2,3,6], 'cats': [1,4,5] }

あなたの質問の残りの部分については、はい、すべて正しいです。しかし、これを書く代わりに:

var myMap = {};
myMap["cats"] = new Array(1,4,5);   //animals 1,4,5 are cats
myMap["dogs"] = new Array(2,3,6);   //animals 2,3,6 are dogs  

これを書くことをお勧めします:

var myMap = {
    'cats': [1,4,5], //animals 1,4,5 are cats
    'dogs': [2,3,6]  //animals 2,3,6 are dogs  
};

またはおそらくこれ:

var animals = [ 'cats', 'dogs', 'dogs', 'cats', 'cats', 'dogs' ];
于 2013-05-10T01:39:09.427 に答える