web-dev-qa-db-ja.com

連想配列の削除とスプライス

私が収集したJS連想配列が実際にオブジェクトであり、要素を削除したい場合、delete myArr[someId]を使用すると要素が未定義に設定されますが、スプライスはまったく機能しません...要素を削除する場合の連想配列の代替は何ですか(undefinedに設定するのではなく)

45
sarsnake

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を使用します。

お役に立てれば。

167
Geuis

他のオプションはありません。 myArr["someCrazyIndexYouHaventPreviouslyUsed"]は未定義を返します。連想配列は、存在しないインデックスに対して常にundefinedを提供します。

したがって、myArr[someId]を削除すると、myArrsomeIdを、存在しない他のすべてのインデックスと同様に処理します。

5
Adam Rackis