6

配列をループして要素を削除し、要素が 1 つだけになるまでスキップしようとしています。スプライシングを試みましたが、arr[1] の要素が arr[0] などになるため、ループが台無しになります。

10人いるとしましょう。人物 1 を削除して人物 2 を保持し、次に人物 3 を削除して人物 4 を保持したいと思います。このパターンは、1 人だけになるまで続きます。

どんな種類の助けでも構いません。

4

13 に答える 13

29

虚偽の項目をフィルタリングします。

var a=[1,2,"b",0,{},"",NaN,3,undefined,null,5];
var b=a.filter(Boolean); // [1,2,"b",{},3,5]
于 2014-12-15T14:48:40.727 に答える
9

スプライスするときは、ループ インデックスを減らすだけです。

良い提案がたくさんありました。さまざまなオプションのコードを投稿します。どれを使用するかを決めることができます

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.spliceIE 11、FF、および Chromeは、これが最速であることに同意します。10 倍 (Chrome)、20 倍 (IE 11)Array.filter.と比べて、アイテムを新しい配列に入れるのも遅かったArray.sliceです。http://jsperf.com/clean-undefined-values-from-array2を参照してください

ここで IE が群れをリードし、Chrome が FF と IE の背後にあることに本当に驚いています。その結果でテストを実行したことはないと思います。

于 2012-03-07T05:07:25.040 に答える
9

JavaScriptだけでなくすべての言語の反復中にコレクションを変更しないでください。新しい配列を定義し、削除したいものを追加し、後でそれを反復して最初の配列から削除します。

于 2012-03-07T05:08:19.740 に答える
3

逆方向にループします。(アイテムを削除しても、まだ処理されていない要素のインデックスには影響しません。)

于 2012-03-07T05:10:43.170 に答える
3

万が一CoffeeScriptを使用している場合は、配列から undefined を削除するには、これを行います

values = ['one', undefined]
values = (item for item in values when item != undefined) 

values
/* => ['one'] */
于 2012-12-12T17:10:38.563 に答える
1

驚くべきことに、誰も最善かつ正しい方法に答えていません:

  1. 新しいアレイを作成
  2. 古い配列を反復処理し、保持したい要素のみを新しい配列にプッシュします

@nnnnnnのコメントにいくらかの功績があります

于 2012-06-12T14:38:14.147 に答える
0

これはあなたのためのサンプルです

<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>
于 2012-03-07T05:26:14.377 に答える
0

あなたが達成しようとしていることを正確に収集していませんが、プログラムを続行するために配列内の項目の位置インデックスに依存していると思います。この場合、ハッシュ配列、つまり Key<>Value ペア配列をお勧めします。

その場合、arr["2"]常に最初に配置したアイテムを指します。したがって、位置の変更を気にせずに、論理的/数値的にループすることができます。

型変換のリスクと落とし穴に注意してください!

于 2012-03-07T05:11:14.120 に答える
0

あなたの最善の策は、配列の複製を作成してから、元のものからスプライスすることです。

または、コレクション(キー->値)を使用して、キーを削除するだけです。

 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];
于 2012-03-07T05:11:28.097 に答える
0
function removeUndefined(array)
{
    var i = 0;
    while (i < array.length)
        if (typeof array[i] === 'undefined')
            array.splice(i, i);
        else
            i++;
    return array;
}

編集:タイトルに基づいてこれを書きました。質問はまったく別のことを尋ねているようです。

于 2012-03-07T05:15:50.657 に答える
0
>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);  
于 2018-03-17T20:39:35.317 に答える
0

これはあなたが望むものではないかもしれませんが、この手順の最後に最終的な要素が何であるかを簡単に計算して、それをつかむことができます. 配列の要素が連続しており、arr[0] から始まると仮定すると、次のことがわかります。

var logBase2OfLength = Math.floor(Math.log(arr.length) / Math.log(2));
var finalElement = arr[(1 << logBase2OfLength) - 1];

基本的に、配列内の要素数以下の 2 の整数乗を取ると、それがすべてのループと削除の後に残る要素の位置になります。

于 2012-03-07T05:56:08.090 に答える
-1
  while(yourarray.length>1) //only one left
    {
    // your code
    }
于 2012-03-07T05:10:18.740 に答える