37

重複の可能性:
JavaScript オブジェクトからプロパティを削除する方法
JavaScript Hashmap Equivalent

私はjQueryを使用しており、この方法で変数を処理しています:

var array = {};

array[an_object]      = something
array[another_object] = something_else
array[...]            = ...

spliceでメソッドを実行しようとするとarrayTypeError: array.splice is not a function. 私の意図は、an_object「キー」とそのすべてのコンテンツをarray変数から削除することです。

どうすればそれを作ることができますか?


:実行すると(および他のすべてのオブジェクトにもconsole.log(array[an_object])同じことが当てはまります)、次のようになります。another_object

[Object { label="str1",  value=1 }, Object { label="str2",  value=2 }, { label="strN",  value=N }]
4

5 に答える 5

28

まず、変数に名前を付けます。使用している名前arrayは、オブジェクトの作成に使用すると誤解を招く可能性があります。

var myObject = {};

myObject[an_object]      = "xyz";
myObject[another_object] = "abc";

deleteこれで、次のステートメントを使用してオブジェクトのエントリを削除できます。

delete myObject[an_object]; // Returns true / false if the deletion is a success / failure
console.log(myObject[an_object]) // Returns undefined

とはいえ、これは期待どおりには機能しません。 オブジェクトをキーとして使用しないでくださいmyObject[an_object]
代わりに文字列を使用してください。
これは、 に入力されたパラメータが[]文字列に変換されるためです。つまり、実際に、あなたは入っていますmyObject["[object Object]"]

于 2012-11-23T08:29:38.193 に答える
5

an_objectキーとして使用されるオブジェクトは、キーの文字列値でなければならないため、オブジェクトの作成方法について少し混乱しています。そうすることを前提として、これはオブジェクトの望ましくないプロパティを削除することで機能するはずです。

var array = {};

array['an_object'] = "something"
array['another_object'] = "something_else"

delete(array.an_object)

console.log(array) // Object { another_object = "something_else" }

編集

コメントで詳しく説明されているように、オブジェクトが別のオブジェクト (この場合は紛らわしい名前array) のキーとして使用されていることが問題である場合、問題は、オブジェクトが最初にオブジェクトのコンテキストで使用される文字列表現に変換されることです。鍵。したがって、キーとして使用されるすべてのオブジェクトは、実際には と呼ばれる 1 つのキーを参照し[object Object]、キーとして使用するオブジェクトはいずれも以前のものを上書きします。

質問の例では...

array[an_object]      = something
array[another_object] = something_else
// array: Object { "[object Object]" = "something_else" }
于 2012-11-23T08:16:37.290 に答える
1

単純な JavaScript で Dictionary を実現するのはかなりトリッキーです。これを処理するには、コンストラクター全体を作成するか、これを処理するライブラリを使用する必要があります。

辞書では、オブジェクトをキーとして使用できるオブジェクト/ハッシュを参照しています。複数の配列 (キー用に 1 つと値用に 1 つ) を使用し、同期を維持するコンストラクターが必要です。典型的な配列メソッドの多くを模倣できますが、前述したように、これはかなりのコードになります。

簡単な代替手段として、次のことができます。

function pushToObject(obj, key, value){
  if( !key||!obj ) return false;
  if( !key[''] ) {
    pushToObject.index = pushToObject.index||[];
    key[''] = pushToObject.index.length;
    pushToObject.index.push(key);
  }
  obj[key['']] = value;
  return true;
}

function removeFromObject(obj, key){
  if( !isNaN(key) ) {
    var list = listKeyObjects(obj);
    var item = list[key];
    return removeFromObject(obj,item);
  }
  else if(key) {
    if( !key[''] ){
      return false;
    }
    return delete obj[key['']];
  }
  return false;
}

function listKeyObjects(obj){
  var a = [];
  for(var i in obj){
    a.push(pushToObject.index[i]);
  }
  return a;
}

利用方法

var array = {}; /// it would be best to change the name of this object
var an_object = {}, another_object = {};

/// add your items to the array object, this handles giving each of your
/// objects used as a key a unique index property. This does mean the objects
/// you use `an_object`, `another_object` are modified.
pushToObject( array, an_object, 'something else' );
pushToObject( array, another_object, 'something other than else' );

console.log(array); /// {0:'something else',1:'something other than else'}

removeFromObject( array, an_object ); /// remove using an object as a key

console.log(array); /// {1:'something other than else'}

removeFromObject( array, 0 ); /// remove using an offset index

console.log(array); /// {}

考えた後

明らかに、このための独自の専用コンストラクターを作成する方が良いオプションですが、キー オブジェクトを変更しないように、もう少しコードを追加して上記を改善できます。pushToObject.index代わりに、オブジェクトをキーとして操作するときはいつでも、キー オブジェクトのオフセットをスキャンできます。キーオブジェクトを変更するバージョンを選択しましたが、配列を変更するたびにリストをスキャンするよりも高速に機能するはずです。

キー関数を取得

上記のコードは、追加方法と削除方法を示しているだけですが、オフセットから特定のキー オブジェクトを取得することもお勧めします。

function getKeyObjectAtIndex = function(obj, index){
  var list = listKeyObjects(obj);
  return list[index] ? list[index] : null;
}

console.log(array); /// {0:'something else',1:'something other than else'}

var key = getKeyObjectAtIndex(array, 1);

console.log(key === another_object) /// === TRUE
于 2012-11-23T08:40:25.713 に答える
0

オブジェクトに対して配列メソッドを起動することはできません。配列の代わりにオブジェクトリテラルを作成した場合、var a = []ORのように定義しますvar a = new Array();

それが役に立てば幸い !!

于 2012-11-23T08:36:17.083 に答える
0

多分このように:

フィドル

var array = {};

var an_object = {};

var another_object = {};    

array[an_object] = 'something'

array[another_object] = 'something_else'

alert(array[an_object]);

array[an_object] = null;

alert(array[an_object]);

delete array[an_object]

alert(array[an_object]);
于 2012-11-23T08:24:02.287 に答える