メソッドを使用するのではなく、配列要素で演算子を使用するdelete
ことの違いは何ですか?Array.splice
例えば:
myArray = ['a', 'b', 'c', 'd'];
delete myArray[1];
// or
myArray.splice (1, 1);
オブジェクトのように配列要素を削除できるのに、なぜスプライスメソッドを使用するのですか?
delete
とArray.prototype.splice
。
メソッドを使用するのではなく、配列要素で演算子を使用するdelete
ことの違いは何ですか?Array.splice
例えば:
myArray = ['a', 'b', 'c', 'd'];
delete myArray[1];
// or
myArray.splice (1, 1);
オブジェクトのように配列要素を削除できるのに、なぜスプライスメソッドを使用するのですか?
delete
とArray.prototype.splice
。
回答:
delete
オブジェクトプロパティは削除されますが、配列のインデックスの再作成や長さの更新は行われません。これにより、未定義のように見えます。
> myArray = ['a', 'b', 'c', 'd']
["a", "b", "c", "d"]
> delete myArray[0]
true
> myArray[0]
undefined
実際には値undefined
に設定されていないことに注意してください。プロパティは配列から削除され、定義されていないように見えます。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"]
delete
は、要素を削除しますが、配列のインデックスを再作成したり、その長さを更新したりしません(長さは常に最大のインデックス+1であるため、前者によってすでに暗示されています)。
delete myArray[0]
「演算子を期待し、代わりに「削除」を見た」という構文は好きではありません。使用することsplice
をお勧めします。
delete myArray[0]
ありmyArray[0] = undefined
ます。前者の場合、プロパティは配列オブジェクトから完全に削除されます。2番目のケースでは、プロパティは値とともに残りますundefined
。
empty
代わりに、キーワードを表示しundefined
ますundefined
。これは私が言うように、としてのみ表示されることを意味empty
し、呼び出されたempty
(存在しない)実際の値を参照しないことに注意してください。
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);
[1,2,3].slice('1'); // =[2,3]
)不愉快なので、次のように変更する方が安全ですvar rest = this.slice(parseInt(to || from) + 1 || this.length);
this.push.apply(this, rest)
、返された値を返します
for(var i in array)
サイクルで反復するときに不要な副作用が発生します。私はそれを取り除き、代わりにスプライスを使用しました。
deleteは配列の要素からオブジェクトを削除するだけなので、配列の長さは変わりません。スプライスはオブジェクトを削除し、配列を短くします。
次のコードは、「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]);
}
myArray.splice(2,1)
ある要素のすべての出現を配列から削除する方法を理解しようとしているときに、私はこの質問に遭遇しました。ここでの比較だの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"]
コアJavaScript 1.5リファレンス>演算子>特殊演算子> delete演算子:
配列要素を削除しても、配列の長さは影響を受けません。たとえば、a [3]を削除しても、a [4]はa [4]のままで、a [3]は未定義です。これは、配列の最後の要素を削除しても削除されます(a [a.length-1]を削除)。
また、スプライスは配列でのみ機能することにも言及する価値があります。(オブジェクトプロパティは、一貫した順序に従うことはできません。)
オブジェクトからキーと値のペアを削除するには、deleteが実際に必要なものです。
delete myObj.propName; // , or:
delete myObj["propName"]; // Equivalent.
上記で何度も述べたように、使用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
削除する古い配列要素の数を示す整数。deleteCountが0の場合、要素は削除されません。この場合、少なくとも1つの新しい要素を指定する必要があります。deleteCountがstartから始まる配列に残っている要素の数より大きい場合、配列の最後までのすべての要素が削除されます。
deleteCountを省略すると、deleteCountは
(arr.length - start).
item1、item2、...
開始インデックスから始まる、配列に追加する要素。要素を指定しない場合、
splice()
は、配列から要素のみが削除されます。戻り値
削除された要素を含む配列。要素を1つだけ削除すると、1つの要素の配列が返されます。要素が削除されない場合、空の配列が返されます。
[...]
deleteは非現実的な状況のように動作し、アイテムを削除するだけですが、配列の長さは同じままです:
ノードターミナルからの例:
> var arr = ["a","b","c","d"];
> delete arr[2]
true
> arr
[ 'a', 'b', , 'd', 'e' ]
以下は、slice()を使用して配列の項目をインデックスで削除する関数です。最初の引数としてarrを取り、2番目の引数として削除するメンバーのインデックスを受け取ります。ご覧のように、実際には配列のメンバーを削除し、配列の長さを1減らします
function(arr,arrIndex){
return arr.slice(0,arrIndex).concat(arr.slice(arrIndex + 1));
}
上記の関数は、インデックスまでのすべてのメンバーと、インデックスの後のすべてのメンバーを取得し、それらを連結して、結果を返します。
上記の関数をノードモジュールとして使用した例を次に示します。ターミナルが役立つことを確認してください。
> var arr = ["a","b","c","d"]
> arr
[ 'a', 'b', 'c', 'd' ]
> arr.length
4
> var arrayRemoveIndex = require("./lib/array_remove_index");
> var newArray = arrayRemoveIndex(arr,arr.indexOf('c'))
> newArray
[ 'a', 'b', 'd' ] // c ya later
> newArray.length
3
indexOf( "c")は最初の出現を取得し、最初に見つかった "c"のみをスプライスして削除するため、これはdupeを含む1つの配列では機能しないことに注意してください。
大規模な配列を反復処理して要素を選択的に削除する場合、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)
},
なぜフィルタリングしないのですか?私はそれがjsの配列を考える最も明確な方法だと思います。
myArray = myArray.filter(function(item){
return item.anProperty != whoShouldBeDeleted
});
delete
やslice
私には。
違いは、delete
演算子とsplice()
メソッドが適用された後に各配列の長さを記録することで確認できます。例えば:
var trees = ['redwood', 'bay', 'cedar', 'oak', 'maple'];
delete trees[3];
console.log(trees); // ["redwood", "bay", "cedar", empty, "maple"]
console.log(trees.length); // 5
delete
オペレータは、配列から要素を削除するが、要素の「プレースホルダー」がまだ存在します。oak
削除されましたが、それでもアレイのスペースが必要です。このため、配列の長さは5のままです。
var trees = ['redwood', 'bay', 'cedar', 'oak', 'maple'];
trees.splice(3,1);
console.log(trees); // ["redwood", "bay", "cedar", "maple"]
console.log(trees.length); // 4
このsplice()
メソッドは、ターゲット値と「プレースホルダー」も完全に削除します。oak
アレイで使用していたスペースと同様に削除されました。配列の長さが4になりました。
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
それらは異なる目的を持つ異なるものです。
splice
アレイから除去するエントリを削除するために使用される場合、配列特異的であり、そしてギャップを埋めるために移動する前のすべてのエントリを。(エントリを挿入するために使用することも、同時に両方を使用することもできます。)配列のsplice
を変更しますlength
(何もしない呼び出しではないと仮定します:)theArray.splice(x, 0)
。
delete
アレイ固有ではありません。オブジェクトで使用するために設計されています。使用するオブジェクトからプロパティ(キー/値のペア)を削除します。JavaScriptの標準(例:型指定されていない)配列は実際には配列ではないため、配列にのみ適用されます。*それらは、名前が「配列インデックス」であるような特定のプロパティを特別に処理するオブジェクトです(文字列名として定義されます "...その数値i
は範囲内にあります+0 ≤ i < 2^32-1
")およびlength
。を使用delete
して配列エントリを削除する場合は、エントリを削除するだけです。ギャップを埋めるためにそれに続く他のエントリは移動しないため、配列は「スパース」になります(一部のエントリが完全に欠落しています)。には影響しませんlength
。
この質問に対する現在の回答のいくつかは、delete
「を使用してエントリを設定する」と誤って述べていundefined
ます。不正解です。エントリ(プロパティ)を完全に削除し、ギャップを残します。
いくつかのコードを使用して違いを説明しましょう:
console.log("Using `splice`:");
var a = ["a", "b", "c", "d", "e"];
console.log(a.length); // 5
a.splice(0, 1);
console.log(a.length); // 4
console.log(a[0]); // "b"
console.log("Using `delete`");
var a = ["a", "b", "c", "d", "e"];
console.log(a.length); // 5
delete a[0];
console.log(a.length); // still 5
console.log(a[0]); // undefined
console.log("0" in a); // false
console.log(a.hasOwnProperty(0)); // false
console.log("Setting to `undefined`");
var a = ["a", "b", "c", "d", "e"];
console.log(a.length); // 5
a[0] = undefined;
console.log(a.length); // still 5
console.log(a[0]); // undefined
console.log("0" in a); // true
console.log(a.hasOwnProperty(0)); // true
* (これは私の貧血の小さなブログの投稿です)
現在これを行うには2つの方法があります
splice()の使用
arrayObject.splice(index, 1);
削除を使用する
delete arrayObject[index];
ただし、削除では配列の長さが更新されないため、配列オブジェクトにはスプライスを使用し、オブジェクト属性には削除を使用することを常にお勧めします。
OK、以下の配列があるとします。
const arr = [1, 2, 3, 4, 5];
最初に削除しましょう:
delete arr[1];
これが結果です:
[1, empty, 3, 4, 5];
空の!それを取得しましょう:
arr[1]; //undefined
つまり、値が削除されただけで現在は未定義であるため、長さは同じであり、trueを返します ...
配列をリセットして、今度はスプライスを使用してみましょう。
arr.splice(1, 1);
そしてこれが今回の結果です:
[1, 3, 4, 5];
配列の長さが変更され、現在arr[1]
は3であることがわかります...
また、これは削除されたアイテムを配列で返し[3]
ます。この場合は...
他のものはすでにと適切に比較さdelete
れていますsplice
。
もう一つの興味深い比較であるdelete
対undefined
削除された配列の項目がちょうどに設定されているものよりも少ないメモリを使用していますundefined
。
たとえば、次のコードは終了しません:
let y = 1;
let ary = [];
console.log("Fatal Error Coming Soon");
while (y < 4294967295)
{
ary.push(y);
ary[y] = undefined;
y += 1;
}
console(ary.length);
このエラーが発生します:
FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory.
ご覧のとおり、undefined
実際にはヒープメモリを消費します。
ただし、delete
ary-itemも(単にに設定するのではなくundefined
)場合、コードはゆっくり終了します。
let x = 1;
let ary = [];
console.log("This will take a while, but it will eventually finish successfully.");
while (x < 4294967295)
{
ary.push(x);
ary[x] = undefined;
delete ary[x];
x += 1;
}
console.log(`Success, array-length: ${ary.length}.`);
これらは極端な例ですが、delete
どこにも言及されている人を見たことがありません。
あなたが小さな配列を持っているなら、あなたは使うことができますfilter
:
myArray = ['a', 'b', 'c', 'd'];
myArray = myArray.filter(x => x !== 'b');
最も簡単な方法はおそらく
var myArray = ['a', 'b', 'c', 'd'];
delete myArray[1]; // ['a', undefined, 'c', 'd']. Then use lodash compact method to remove false, null, 0, "", undefined and NaN
myArray = _.compact(myArray); ['a', 'c', 'd'];
お役に立てれば。リファレンス:https : //lodash.com/docs#compact
compact
たら... lodashは必要ありません。試してみるmyArray.filter(function(n){return n;})
delete:deleteはオブジェクトプロパティを削除しますが、配列のインデックスを再作成したり、その長さを更新したりしません。これにより、未定義のように見えます。
splice:実際に要素を削除し、配列のインデックスを再作成して、その長さを変更します。
最後から要素を削除
arrName.pop();
最初から要素を削除
arrName.shift();
真ん中から削除
arrName.splice(starting index,number of element you wnt to delete);
Ex: arrName.splice(1,1);
最後から1つの要素を削除
arrName.splice(-1);
配列のインデックス番号を使用して削除
delete arrName[1];
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
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'];
.splice
インループについては、この質問を見てください:javascriptの配列から削除してください。