JavaScript での配列要素の削除 - 削除とスプライス
-
20-08-2019 - |
質問
を使用するのとの違いは何ですか の 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
に設定されていないことに注意してください。クロームのdevのツールは、配列をログイン時に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"]
他のヒント
Array.remove() メソッド
ジョン・レシグ, jQuery の作成者が非常に便利なツールを作成しました。 Array.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);
、配列の長さは変化しません。スプライスは、オブジェクトを除去し、アレイを短くする。
次のコードは "A"、 "B" と表示され、 "未定義"、 "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"]
コアJavaScript 1.5リファレンスから>演算子>特殊演算子> <演算子を削除/>
あなたは、配列の要素を削除すると、 配列の長さは影響を受けません。ために あなたが削除した場合の例では、[3]、[4]であります まだ[4]及び[3]は未定義です。この あなたが最後を削除しても保持しています 配列の要素(削除 [a.length-1])。
splice
が数字のインデックスで動作します。
delete
がインデックスの他の種類に対して使用することができるのに対し、..
例:
delete myArray['text1'];
これは、スプライス配列のみで動作することも、おそらく言及する価値があります。 (オブジェクトのプロパティは、一貫した順序に従うことに依拠することはできません。)
あなたが望むものを実際に削除し、オブジェクトからキーと値のペアを削除するには:
delete myObj.propName; // , or:
delete myObj["propName"]; // Equivalent.
削除とスプライスの比較
配列から項目を削除するとき
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);
の場合には 消去 の 要素が削除される しかし インデックスは空のままです
一方、次の場合には スプライス 要素が削除され、 残りの要素のインデックスはそれに応じて減少します
の の削除非現実の世界の状況のように機能し、それだけで<全角> の項目を削除しますが、配列の長さは同じまま:
ノード端末から例:
> var arr = ["a","b","c","d"];
> delete arr[2]
true
> arr
[ 'a', 'b', , 'd', 'e' ]
ここでは、インデックスによって配列の項目を削除する機能があり、をスライス()のを使用して、それが最初の引数としてARRを取り、メンバのインデックスは、あなたはとして削除します第二引数。あなたが見ることができるように、それは実際には配列のメンバーを削除し、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
これは単に最初のoccuranceを取得しますのindexOf(「C」)ので、その中にdupesと1つの配列を働く、とだけ出てスプライスし、最初の「c」を削除しないことに注意してください、それが見つかっています。
、すべての削除のためのスプライス()を呼び出すために高価です。配列はJavaScriptで連想されるので、再インデックス配列その後、個々の要素を削除する方が効率的でしょう。
あなたは新しい配列を構築することにより、それを行うことができます。例えば
function reindexArray( array )
{
var result = [];
for( var key in array )
result.push( array[key] );
return result;
};
しかし、私はあなたがより効率的になり、元の配列でキーの値を変更することができるとは思わない - あなたは新しい配列を作成する必要がありますように見えます。
。あなたは、彼らが実際には存在しないとループのためにそれらを返さないよう「未定義」のエントリをチェックする必要はないことに注意してください。それは未定義として表示し、配列印刷のアーティファクトです。彼らは、メモリに存在することが表示されません。
あなたが速くなりスライス()のようなものを使用することができますが、それは再インデックスしない場合は、それはいいだろう。誰もがより良い方法を知っている?
<時間> おそらく、より効率的である次のように実際には、あなたは場所でそれを行うことができ、おそらく、性能面ます:
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]
なぜだけではなく、フィルタリング?私はそれがJSで配列を検討するための最も明確な方法だと思います。
myArray = myArray.filter(function(item){
return item.anProperty != whoShouldBeDeleted
});
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で配列<のhref =「http://blog.niftysnippets.org/2011/01/myth-of-arrays.html」のrel =「nofollowをnoreferrer」 >本当にすべての*で、彼らは、このような名前が<のhref = "HTTPある「配列インデックスを」(あるものと、特定のプロパティのための特別な処理を持つオブジェクトをしている配列されていません。//www.ecma -international.org/ecma-262/7.0/index.html#sec-object-type「のrel = 『nofollowをnoreferrer』>文字列名としてこの定義された」...その数値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];
ただし、削除では配列の長さは更新されないため、配列オブジェクトには splice を使用し、オブジェクト属性には delete を使用することを常にお勧めします。
の差が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である。
OK、以下の配列があると想像してください。
const arr = [1, 2, 3, 4, 5];
まず削除してみましょう:
delete arr[1];
そしてこれが結果です:
[1, empty, 3, 4, 5];
空の! それを取得しましょう:
arr[1]; //undefined
つまり、値だけが削除され、それは 未定義 今、長さは同じなので、また戻ります 真実...
配列をリセットして、今回は splice を使用して実行しましょう。
arr.splice(1, 1);
そして今回の結果はこうなりました。
[1, 3, 4, 5];
ご覧のとおり、配列の長さが変更され、 arr[1]
は 3 今...
また、これは削除された項目を配列で返します。 [3]
この場合...
最も簡単な方法は、おそらくです。
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する
Lodash に使用したい人たちが使用できる場合:
myArray = _.without(myArray, itemToRemove)
それとも私がAngular2に使うよう
import { without } from 'lodash';
...
myArray = without(myArray, itemToRemove);
...
の の削除:削除するオブジェクトのプロパティを削除しますが、インデックスを再作成しません 配列またはその長さを更新します。これは、それがあるかのように表示されます 未定義ます:
のスプライスする:実際に、要素を削除するアレイを再度インデックスを付け、変更 その長ます。
最後から要素を削除します。
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];
削除する目的の要素が途中である場合(私たちはそのインデックスが1である「C」を、削除したいと言う)、あなたが使用することができます:
var arr = ['a','b','c'];
var indexToDelete = 1;
var newArray = arr.slice(0,indexToDelete).combine(arr.slice(indexToDelete+1, arr.length))
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'];