メソッドを使用するのではなく、配列要素で演算子を使用するdelete
ことの違いは何ですか?Array.splice
例えば:
myArray = ['a', 'b', 'c', 'd'];
delete myArray[1];
// or
myArray.splice (1, 1);
オブジェクトと同じように配列要素を削除できるのに、なぜ splice メソッドがあるのでしょうか?
メソッドを使用するのではなく、配列要素で演算子を使用するdelete
ことの違いは何ですか?Array.splice
例えば:
myArray = ['a', 'b', 'c', 'd'];
delete myArray[1];
// or
myArray.splice (1, 1);
オブジェクトと同じように配列要素を削除できるのに、なぜ splice メソッドがあるのでしょうか?
delete
オブジェクト プロパティを削除しますが、配列のインデックスを再作成したり、その長さを更新したりしません。これにより、未定義であるかのように見えます。
> myArray = ['a', 'b', 'c', 'd']
["a", "b", "c", "d"]
> delete myArray[0]
true
> myArray[0]
undefined
undefined
実際には valueに設定されているのではなく、プロパティが配列から削除され、未定義のように見えることに注意してください。Chrome 開発ツールempty
は、配列をログに記録するときに出力することで、この区別を明確にします。
> myArray[0]
undefined
> myArray
[empty, "b", "c", "d"]
myArray.splice(start, deleteCount)
実際に要素を削除し、配列のインデックスを再作成し、その長さを変更します。
> myArray = ['a', 'b', 'c', 'd']
["a", "b", "c", "d"]
> myArray.splice(0, 2)
["a", "b"]
> myArray
["c", "d"]
jQuery の作成者であるJohn ResigArray.remove
は、私が自分のプロジェクトで常に使用する非常に便利なメソッドを作成しました。
// Array Remove - By John Resig (MIT Licensed)
Array.prototype.remove = function(from, to) {
var rest = this.slice((to || from) + 1 || this.length);
this.length = from < 0 ? this.length + from : from;
return this.push.apply(this, rest);
};
そして、これがどのように使用されるかのいくつかの例です:
// Remove the second item from the array
array.remove(1);
// Remove the second-to-last item from the array
array.remove(-2);
// Remove the second and third items from the array
array.remove(1,2);
// Remove the last and second-to-last items from the array
array.remove(-2,-1);
delete は配列内の要素からオブジェクトを削除するだけなので、配列の長さは変わりません。Splice はオブジェクトを削除し、配列を短くします。
次のコードは、"a"、"b"、"undefined"、"d" を表示します。
myArray = ['a', 'b', 'c', 'd']; delete myArray[2];
for (var count = 0; count < myArray.length; count++) {
alert(myArray[count]);
}
これは「a」、「b」、「d」を表示しますが、
myArray = ['a', 'b', 'c', 'd']; myArray.splice(2,1);
for (var count = 0; count < myArray.length; count++) {
alert(myArray[count]);
}
配列から要素のすべての出現を削除する方法を理解しようとしているときに、私はこの質問に出くわしました。これは、配列からすべてを削除するためのとの比較です。splice
delete
'c'
items
var items = ['a', 'b', 'c', 'd', 'a', 'b', 'c', 'd'];
while (items.indexOf('c') !== -1) {
items.splice(items.indexOf('c'), 1);
}
console.log(items); // ["a", "b", "d", "a", "b", "d"]
items = ['a', 'b', 'c', 'd', 'a', 'b', 'c', 'd'];
while (items.indexOf('c') !== -1) {
delete items[items.indexOf('c')];
}
console.log(items); // ["a", "b", undefined, "d", "a", "b", undefined, "d"]
Core JavaScript 1.5 Reference > Operators > Special Operators > delete Operatorから:
配列要素を削除しても、配列の長さは影響を受けません。たとえば、a[3] を削除しても、a[4] は a[4] のままで、a[3] は未定義です。これは、配列の最後の要素を削除しても保持されます (delete a[a.length-1])。
上で何度も述べたように、使用splice()
は完璧にフィットするようです。Mozilla のドキュメント:
この
splice()
メソッドは、既存の要素を削除したり、新しい要素を追加したりして、配列の内容を変更します。var myFish = ['angel', 'clown', 'mandarin', 'sturgeon']; myFish.splice(2, 0, 'drum'); // myFish is ["angel", "clown", "drum", "mandarin", "sturgeon"] myFish.splice(2, 1); // myFish is ["angel", "clown", "mandarin", "sturgeon"]
構文
array.splice(start) array.splice(start, deleteCount) array.splice(start, deleteCount, item1, item2, ...)
パラメーター
始める
配列の変更を開始するインデックス。配列の長さより大きい場合、実際の開始インデックスは配列の長さに設定されます。負の場合、最後からその数の要素を開始します。
削除数
削除する古い配列要素の数を示す整数。deleteCount が 0 の場合、要素は削除されません。この場合、少なくとも 1 つの新しい要素を指定する必要があります。deleteCount が配列に残っている要素の数よりも大きい場合は、配列の末尾までのすべての要素が削除されます。
deleteCount が省略された場合、deleteCount は次のようになります。
(arr.length - start).
アイテム1、アイテム2、...
開始インデックスから始まる、配列に追加する要素。要素を指定しない場合
splice()
、配列から要素のみが削除されます。戻り値
削除された要素を含む配列。要素を 1 つだけ削除すると、要素が 1 つの配列が返されます。要素が削除されない場合は、空の配列が返されます。
[...]
splice
数値インデックスで動作します。
一方、delete
他の種類のインデックスに対して使用できます..
例:
delete myArray['text1'];
削除対スプライス
配列からアイテムを削除するとき
var arr = [1,2,3,4]; delete arr[2]; //result [1, 2, 3:, 4]
console.log(arr)
スプライスするとき
var arr = [1,2,3,4]; arr.splice(1,1); //result [1, 3, 4]
console.log(arr);
削除の場合、要素は削除されますが、インデックスは空のままです
スプライス要素の場合は削除され、残りの要素のインデックスはそれに応じて減少します
splice は配列でのみ機能することにも言及する価値があるでしょう。(オブジェクトのプロパティは、一貫した順序に従うことに依存することはできません。)
オブジェクトからキーと値のペアを削除するには、実際には delete が必要です。
delete myObj.propName; // , or:
delete myObj["propName"]; // Equivalent.
大きな配列を繰り返して要素を選択的に削除する場合、splice()は毎回後続の要素のインデックスを再作成する必要があるため、削除するたびにsplice()を呼び出すのはコストがかかります。配列はJavascriptで関連付けられているため、個々の要素を削除してから、後で配列のインデックスを再作成する方が効率的です。
新しいアレイを構築することでそれを行うことができます。例えば
function reindexArray( array )
{
var result = [];
for( var key in array )
result.push( array[key] );
return result;
};
ただし、元の配列のキー値を変更することはできないと思います。これは、より効率的です。新しい配列を作成する必要があるようです。
「未定義」のエントリは実際には存在せず、forループでは返されないため、チェックする必要がないことに注意してください。これは、配列印刷のアーティファクトであり、未定義として表示されます。それらはメモリに存在していないように見えます。
より高速なslice()のようなものを使用できれば便利ですが、インデックスは再作成されません。誰かがより良い方法を知っていますか?
実際には、おそらく次のように適切に行うことができます。これは、おそらくより効率的で、パフォーマンスの面で次のようになります。
reindexArray : function( array )
{
var index = 0; // The index where the element should be
for( var key in array ) // Iterate the array
{
if( parseInt( key ) !== index ) // If the element is out of sequence
{
array[index] = array[key]; // Move it to the correct, earlier position in the array
++index; // Update the index
}
}
array.splice( index ); // Remove any remaining elements (These will be duplicates of earlier items)
},
このようなものを使用できます
var my_array = [1,2,3,4,5,6];
delete my_array[4];
console.log(my_array.filter(function(a){return typeof a !== 'undefined';})); // [1,2,3,4,6]
function remove_array_value(array, value) {
var index = array.indexOf(value);
if (index >= 0) {
array.splice(index, 1);
reindex_array(array);
}
}
function reindex_array(array) {
var result = [];
for (var key in array) {
result.push(array[key]);
}
return result;
}
例:
var example_arr = ['apple', 'banana', 'lemon']; // length = 3
remove_array_value(example_arr, 'banana');
バナナが削除され、配列の長さ = 2
IndexOf
参照型も受け入れます。次のシナリオを想定します。
var arr = [{item: 1}, {item: 2}, {item: 3}];
var found = find(2, 3); //pseudo code: will return [{item: 2}, {item:3}]
var l = found.length;
while(l--) {
var index = arr.indexOf(found[l])
arr.splice(index, 1);
}
console.log(arr.length); //1
別の方法:
var item2 = findUnique(2); //will return {item: 2}
var l = arr.length;
var found = false;
while(!found && l--) {
found = arr[l] === item2;
}
console.log(l, arr[l]);// l is index, arr[l] is the item you look for
削除したい要素が真ん中にある場合 (たとえば、インデックスが 1 の 'c' を削除したい場合)、次を使用できます。
var arr = ['a','b','c'];
var indexToDelete = 1;
var newArray = arr.slice(0,indexToDelete).combine(arr.slice(indexToDelete+1, arr.length))
function deleteFromArray(array, indexToDelete){
var remain = new Array();
for(var i in array){
if(array[i] == indexToDelete){
continue;
}
remain.push(array[i]);
}
return remain;
}
myArray = ['a', 'b', 'c', 'd'];
deleteFromArray(myArray , 0);
// 結果 : myArray = ['b', 'c', 'd'];