1

次の要件があります。キーとして機能する整数のペアと、値として機能する別の整数のペアがあります。あれは:

obj[{key1:12,key2:23}]=[2,3];

obj[{key1:12,key2:22}]=[4,3];

obj[{key1:34,key2:12}]=[4,33];

また、最終的にこのリストの作成が終了したら、オブジェクト/配列の要素に順次アクセスしたいと考えています。

オブジェクトをキーとして受け取るような配列の場合、それらは連想配列と呼ばれ、Javascript はそれらをサポートしていないことを理解しています。

以下は、この構造に対して実行する操作です。

  1. 挿入: (2,3) または (2,4) のようなキーがあり、[1,2] などの新しいキーと値のペアを使用して配列に挿入します。

  2. Lookup : (2,3) のようなキー ペアが既にこの配列に挿入されている可能性があり、それを取得して変更できるようにしたいと考えています。

それは次のようなものです:

if(obj[{key1:2,key2:3}])
   obj[{key1:2,key2:3}]=[2,5];
else 
   obj[{key1:2,key2:3}]=[2,-1];

これをJavascriptで実装する方法について何か提案はありますか?

編集:これらは私が試した2つのことです:

まず、オブジェクトの配列として作成しました。このアプローチは機能しませんでした。周りを見回すと、Javascript は toString メソッドを呼び出して、オブジェクトに相当する文字列を取得し、それからインデックスを使用することを知っていたからです。

次に、サブオブジェクトを含むオブジェクト キーを持つオブジェクトを実行しようとしました。この回答の行に沿った何か: Answer . ただし、挿入フェーズが完了した後、すべての要素に順次アクセスする方法がわかりません。

4

4 に答える 4

2

おそらくこれはあまり好きではないでしょうが、少なくとも安定した鍵が得られます:

obj[JSON.stringify({key1:12,key2:23})]=[2,3];

したがって、大きな問題は、オブジェクトの「キー」(実際には「プロパティ」) が文字列であるか、文字列化できる必要があることです。あなたの例で{key1:12,key2:23}は、常にに文字列化され[object Object]ます。したがって、一意のキーを取得することはありません。その一意のキーを取得する唯一の方法は、JSON.stringifyメソッドを使用するなどして、実際にシリアル化することです。

IE8 では、JSON クラスを含める必要があると思います。

于 2013-11-05T07:15:32.883 に答える
1

二次元配列を使用できます

var arr = [];
arr[2] = [];
arr[2][3] = [1, 2];

または、オブジェクトを使用して、オブジェクトのプロパティ名を使用してペアにアクセスすることもできます

obj = {
  _2_3: [1, 2],
  _2_1: [4, 1],
  _1_2: [3, 2]
};

obj["_2_3"]thisまたは thisのようにアクセスしますobj._2_3

または多分あなたはemをネストすることができます

obj = {
  _1: {
    _2: [2,1]
  }
};

obj["_1"]["_2"] このように、またはおそらくこのようにアクセスできます

obj = {
      1: {
        2: [2,1]
      }
    };

しかし、連想配列表記を使用することを余儀なくされます。obj["1"]["2"] 私が知る限り、オブジェクトのプロパティにアクセスするために連想配列のような方法を使用することは良い習慣ではありません

于 2013-11-05T08:06:06.423 に答える
1

これを行うオブジェクト指向の方法を次に示します。

// Constructor
function AssociativeArray() {
  this.length = 0;
}

// Add or set value
AssociativeArray.prototype.set = function(key, value) {
  key = key.key1+'|'+key.key2;
  if(!this[key]) {
    this.length++;
  }
  this[key] = value;
};

// Lookup
AssociativeArray.prototype.get = function(key) {
  return this[key.key1+'|'+key.key2];
};

AssociativeArray.prototype.toString = function() {
  var k, arr = [];
  for(k in this) {
    if(this.hasOwnProperty(k) && k !== 'length') {
      arr.push(this[k]);
    }
  }
  return arr;
};

// Create Associative Array
var arr = new AssociativeArray();

// empty array
console.log(arr.toString(), 'length='+arr.length); // [] length=0

// add value
arr.set({key1:1, key2:2}, [1,1]);
console.log(arr.toString(), 'length='+arr.length); // [[1,1]] length=1

// add value
arr.set({key1:2, key2:1}, [2,2]);
console.log(arr.toString(), 'length='+arr.length); // [[1,1], [2,2]] length=2

// set value
arr.set({key1:2, key2:1}, [3,3]);
console.log(arr.toString(), 'length='+arr.length); // [[1,1], [3,3]] length=2

// lookup and set
if(arr.get({key1:2, key2:3})) {
  arr.set({key1:2, key2:3}, [2,5]);
} else {
  arr.set({key1:2, key2:3}, [2,-1]);
}
console.log(arr.toString(), 'length='+arr.length); // [[1, 1], [3, 3], [2, -1]] length=3

ここでフィドル: http://jsbin.com/ohOwala/3/edit

于 2013-11-05T07:39:13.203 に答える
0

オブジェクトがどこから来たのかを尋ねたのは、{key1:2,key3:2}それを制御できる場合は、オブジェクトから文字列への変換を処理するこれらの型に対して toString メソッドを実装できるため、プロパティ名として使用できるからです。

//define keypair object type
var MyKeyPair = function(key1,key2){
  this.key1=key1;
  this.key2=key2;
};
//define tostring for this type
// later obj[aKeyPairInstance] will
// invoke the toString method
// if you don't do this then [Object object]
// would be returned for toString
MyKeyPair.prototype.toString=function(){
  //since you know there is only going to be key1 and key2
  // you could just:
  // return this.key1+":"+this.key2;
  //Here follows a more general approach but it'll cost
  // you more cpu time, if working with very large amounts
  // of data use the shorter version.
  var ret=[];
  for(thing in this){
    if(this.hasOwnProperty(thing)){
      ret.push(thing);
      ret.push(":");
      ret.push(this[thing]);
      ret.push(",");
    }
  }
  return ret.join("");
};

// make a bunch of keyPair objects
var keys = [
  new MyKeyPair(21,33),
  new MyKeyPair(22,34),
  new MyKeyPair(23,35),
  new MyKeyPair(24,36)
];

//create an object and give it properties
// based on the tostring value of the keypairs
var obj={};
for(var i = 0,len=keys.length;i<len;i++){
  obj[keys[i]]=[keys[i].key1,keys[i].key2];
};

console.log(obj);//<=this would not log any usefull info in IE
     //Use Chrome, Firefox, Opera or any other browser instead
于 2013-11-05T07:40:00.157 に答える