私が収集したJS連想配列が実際にオブジェクトであり、要素を削除したい場合、delete myArr[someId]
を使用すると要素が未定義に設定されますが、スプライスはまったく機能しません...要素を削除する場合の連想配列の代替は何ですか(undefined
に設定するのではなく)
Jsの用語は最初は混乱する可能性があるため、それをまっすぐにしましょう。
はい、jsのほとんどすべてがオブジェクトです。ただし、データ型には違いがあります。
配列は連想配列としてlike使用できますが、オブジェクトリテラルとは異なります。
var x = []; //array
var y = {}; //object literal
配列はリストのようなものです。配列のキーは、数値インデックスまたは文字列にすることができます。
var x = ['a','b']; // x[0] === 'a', x[1] === 'b';
var x = [];
x['one'] = 'a';
x['blah'] = 'b';
オブジェクトリテラルは辞書のようなものです。それらは同様の方法で使用できます。
var x = { 0: 'a', 1: 'b' };
var x = { one: 'a', two: 'b' };
ただし、ここで違いを理解する必要があります。
オブジェクトリテラルのような配列likeを使用できますが、配列のようなオブジェクトリテラルは使用できません。
配列には自動化された「長さ」プロパティがあり、配列内の要素の総数に基づいて自動的に増減します。オブジェクトリテラルではこれを取得できません。配列は、shift、unshift、splice、pop、Pushなどの他の配列固有のメソッドもすべて取得します。オブジェクトリテラルにはこれらのメソッドはありません。
削除と、配列およびオブジェクトリテラルで何が起こるかについて話しましょう。
var x = ['a', 'b']; //["a", "b"]
delete x[0]; //[undefined, "b"]
var x = {0:'1', 1:'b'}// { 0:"1", 1:"b"}
delete x[0]; // { 1:"b" }
配列の要素で削除を実行しても、配列の長さは変わりません。要素のインデックスは保持され、値は「未定義」に設定されます。
逆に、オブジェクトリテラルで削除を実行すると、オブジェクトからキー/値が削除されます。
最後に、配列から要素を削除する場合。
var x = ['a', 'b'];
x.splice(0,1); //modifies x. ['b']
つまり、要約ではオブジェクトリテラルでdeleteを使用します。配列ではspliceを使用します。
お役に立てれば。
他のオプションはありません。 myArr["someCrazyIndexYouHaventPreviouslyUsed"]
は未定義を返します。連想配列は、存在しないインデックスに対して常にundefined
を提供します。
したがって、myArr[someId]
を削除すると、myArr
がsomeId
を、存在しない他のすべてのインデックスと同様に処理します。