質問

を使用するのとの違いは何ですか 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"]
​

spliceが数字のインデックスで動作します。

deleteがインデックスの他の種類に対して使用することができるのに対し、..

例:

delete myArray['text1'];

これは、スプライス配列のみで動作することも、おそらく言及する価値があります。 (オブジェクトのプロパティは、一貫した順序に従うことに依拠することはできません。)

あなたが望むものを実際に削除し、オブジェクトからキーと値のペアを削除するには:

delete myObj.propName;     // , or:
delete myObj["propName"];  // Equivalent.
上記を何度も述べたように、

splice()を使用すると、ぴったりのように思えます。 P>

  

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スタートから始まる配列に残っ要素の数よりも大きい場合、エレメントのすべての配列の終わりまでは削除されます。

     

deleteCountが省略された場合、deleteCountは(arr.length - start).に等しくなる

     

ITEM1、ITEM2、...

     

要素は、開始インデックスから始まり、アレイに追加します。あなたが任意の要素を指定しない場合、splice()は、配列から要素を削除します。

     

戻り値

     

削除された要素を含む配列。一つだけの要素が削除された場合は、一つの要素の配列が返されます。何要素が除去されていない場合、空の配列が返されます。

     

[...]

削除とスプライスの比較

配列から項目を削除するとき

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 つの方法があります

  1. splice() を使用する

    arrayObject.splice(index, 1);

  2. 削除を使用して

    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'];

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top