2017-09-13 4 views
0

配列から要素の範囲を削除しますしかし、結果:JavaScriptの私は、配列から要素の範囲を削除したい

["Banana", "Orange1", "Orangex"] 

なぜこれが起こっていますか?

これを行うには、より高速で優れた方法がありますか?

+3

ことをしてみてください。最初のパラメータはアイテムの数を定義し、2番目のパラメータは開始インデックスです。 – Leth

+6

[第2引数はインデックスではありません] 。 – Cerbrus

答えて

2

Array.prototype.splice()の2番目のパラメータは、削除する要素の数であり、終了インデックスではありません。で

パラメータ

startインデックス(原点0を含む)の配列を変更することを開始する:

あなたはそのArray.prototype.splice() MDN Referenceから見ることができます。 が配列の長さより大きい場合、実際の開始インデックスは で、配列の長さに設定されます。負の場合は、配列の終わり(原点1)から多くの 要素を開始し、絶対値が配列の長さより大きい場合は、 0に設定されます。

deleteCount任意削除する古い配列 の要素の数を示す整数。 deleteCountが0の場合、要素は削除されません。 この場合、少なくとも1つの新しい要素を指定する必要があります。 deleteCount が配列内に残っている要素の数( startから開始)より大きい場合、配列の最後までの要素はすべて、 が削除されます。

ソリューション:

あなたはこれらの二つのインデックス間の要素の数を計算するので、正確な数を取得するためにb-a+1を使用する必要があります。

デモ:

これはあなたのコードがどうあるべきかです:

var fruits = ["Banana", "Orange1", "Apple", "Banana", "Orange", "Banana", "Orange", "Mango", "Bananax", "Orangex"]; 
 
var a = fruits.indexOf("Apple"); 
 
var b = fruits.indexOf("Mango"); 
 

 
var removedFruits = fruits.splice(a, b-a+1); 
 

 
console.log(fruits);

1

ここで、フィルタでそれを行うための一つの方法です:

var fruits = ["Banana", "Orange1", "Apple", "Banana", "Orange", "Banana", "Orange", "Mango", "Bananax", "Orangex"]; 
var a = fruits.indexOf("Apple"); 
var b = fruits.indexOf("Mango"); 

//returns items not equal to a or b 
function fruitfilter(item, index){ 
return index !== a && index !== b; 
} 

//apply the filter to the array, returns a new array 
var newfruits = fruits.filter(fruitfilter); 
//log the new fruits 
console.log(newfruits); 

はここですAJ sfiddle:link

0

これは配列のために起こります。()削除する最初のインデックスと要素の数を取るスプライスない最後のインデックス はあなたが正しくスプライス機能を使用していない

fruits.splice(a, b - a + 1); 
関連する問題