配列をループして要素を削除し、要素が 1 つだけになるまでスキップしようとしています。スプライシングを試みましたが、arr[1] の要素が arr[0] などになるため、ループが台無しになります。
10人いるとしましょう。人物 1 を削除して人物 2 を保持し、次に人物 3 を削除して人物 4 を保持したいと思います。このパターンは、1 人だけになるまで続きます。
どんな種類の助けでも構いません。
配列をループして要素を削除し、要素が 1 つだけになるまでスキップしようとしています。スプライシングを試みましたが、arr[1] の要素が arr[0] などになるため、ループが台無しになります。
10人いるとしましょう。人物 1 を削除して人物 2 を保持し、次に人物 3 を削除して人物 4 を保持したいと思います。このパターンは、1 人だけになるまで続きます。
どんな種類の助けでも構いません。
虚偽の項目をフィルタリングします。
var a=[1,2,"b",0,{},"",NaN,3,undefined,null,5];
var b=a.filter(Boolean); // [1,2,"b",{},3,5]
スプライスするときは、ループ インデックスを減らすだけです。
良い提案がたくさんありました。さまざまなオプションのコードを投稿します。どれを使用するかを決めることができます
http://jsfiddle.net/mendesjuan/aFvVh/をスプライシングするときにインデックスを減らす
var undef;
var arr = [1,2, undef, 3, 4, undef];
for (var i=0; i < arr.length; i++) {
if ( arr[i] === undef ) {
arr.splice(i,1);
i--;
}
}
逆方向にループ http://jsfiddle.net/mendesjuan/aFvVh/1/
var undef;
var arr = [1,2, undef, 3, 4, undef];
for (var i=arr.length - 1; i >=0; i--) {
if ( arr[i] === undef ) {
arr.splice(i,1);
}
}
新しい配列 http://jsfiddle.net/mendesjuan/aFvVh/2/にコピーします
var undef;
var arr = [1,2, undef, 3, 4, undef];
var temp = [];
for (var i=0; i < arr.length; i++) {
if ( arr[i] !== undef ) {
temp.push(arr[i])
}
}
arr = temp;
新しい配列を作成するための単なる派手な方法であるフィルターを使用します
var undef;
var arr = [1,2, undef, 3, 4, undef];
arr = arr.filter(function(item){
return item !== undef;
});
これらすべての例の最後で、arr は [1,2,3,4] になります。
パフォーマンス
Array.splice
IE 11、FF、および Chromeは、これが最速であることに同意します。10 倍 (Chrome)、20 倍 (IE 11)Array.filter.
と比べて、アイテムを新しい配列に入れるのも遅かったArray.slice
です。http://jsperf.com/clean-undefined-values-from-array2を参照してください
ここで IE が群れをリードし、Chrome が FF と IE の背後にあることに本当に驚いています。その結果でテストを実行したことはないと思います。
JavaScriptだけでなくすべての言語の反復中にコレクションを変更しないでください。新しい配列を定義し、削除したいものを追加し、後でそれを反復して最初の配列から削除します。
逆方向にループします。(アイテムを削除しても、まだ処理されていない要素のインデックスには影響しません。)
万が一CoffeeScriptを使用している場合は、配列から undefined を削除するには、これを行います
values = ['one', undefined]
values = (item for item in values when item != undefined)
values
/* => ['one'] */
これはあなたのためのサンプルです
<script lanauge = "javascript">
var arr = ["1","2","3","4"];
delete arr[1];// arr[1] is undefined
delete arr[2];// arr[2] is undefined
// now arr.length is 4
var todelete = [];
for (i = 0 ; i < arr.length ;i++)
{
if (typeof arr[i] == 'undefined') todelete.push(i);
}
todelete.sort(function(a, b) { return b-a }); // make the indeies from big to small
for (i = 0;i < todelete.length; i ++)
{
arr.splice(todelete[i],1);
}
// now arr.length is 2
</script>
あなたが達成しようとしていることを正確に収集していませんが、プログラムを続行するために配列内の項目の位置インデックスに依存していると思います。この場合、ハッシュ配列、つまり Key<>Value ペア配列をお勧めします。
その場合、arr["2"]
常に最初に配置したアイテムを指します。したがって、位置の変更を気にせずに、論理的/数値的にループすることができます。
型変換のリスクと落とし穴に注意してください!
あなたの最善の策は、配列の複製を作成してから、元のものからスプライスすることです。
または、コレクション(キー->値)を使用して、キーを削除するだけです。
People = {a: "Person A", b: "Person B", c:"Person C"};
delete People.a;
delete People.c; //now the People collection only has 1 entry.
例として使用するだけで、a、b、cを数字に置き換えることができます。
People = {0: "Person A", 1: "Person B", 2:"Person C"};
delete People[0];
delete People[1];
function removeUndefined(array)
{
var i = 0;
while (i < array.length)
if (typeof array[i] === 'undefined')
array.splice(i, i);
else
i++;
return array;
}
編集:タイトルに基づいてこれを書きました。質問はまったく別のことを尋ねているようです。
>If you are getting undefined during deletion of the key-pair, Then to prevent "undefined" you can try code given below to delete key-pair
1) test = ["1","2","3","4",""," "];
2) var delete = JSON.stringify(test);
case1) delete = delete.replace(/\,""/g,'');
or
case2) delete = delete.replace(/\," "/g,'');
or
case3) delete = delete.replace(/\,null/g,'');
3) var result = JSON.parse(delete);
これはあなたが望むものではないかもしれませんが、この手順の最後に最終的な要素が何であるかを簡単に計算して、それをつかむことができます. 配列の要素が連続しており、arr[0] から始まると仮定すると、次のことがわかります。
var logBase2OfLength = Math.floor(Math.log(arr.length) / Math.log(2));
var finalElement = arr[(1 << logBase2OfLength) - 1];
基本的に、配列内の要素数以下の 2 の整数乗を取ると、それがすべてのループと削除の後に残る要素の位置になります。
while(yourarray.length>1) //only one left
{
// your code
}