-1

このような配列がある場合

 A = ["1111", "22", "33", undefined, "55", undefined] ;

いくつかの要素を削除してこの配列を取得しました

ループせずに配列内に未定義があるかどうかを見つける必要があります

A.indexOf('undefined') or A.indexOf(undefined)  .. wont work 

では、indexOfメソッドを使用してこの配列内に未定義が存在することをどのように確認できますか?

4

2 に答える 2

3

以下のコメントを再確認してください。

必要なのは var A = ["1111", "22", "33", undefined, "55", undefined] ; Aでは、スプライスメソッドによって未定義のすべてを削除し、A = ["1111", "22", "33","55"]のような配列を取得する必要があります

それはあなたの元の質問とはまったく異なる質問です。次のように、ES5 より前のシステムでシム可能 (「ES5 shim」を検索)である新しい ES5 Array#filter( MDN ) 関数を使用してそれを行うことができます。

A = A.filter(function(val) {
    return val !== undefined;
});

またはforループとArray#spliceMDN)を使用:

var index;
for (index = A.length - 1; index >= 0; --index) {
    if (A[index] === undefined) {
        A.splice(index, 1);
    }
}

質問に対する元の回答indexOf:

あなたはそれA.indexOf(undefined)があなたのために働いていないと言いました。undefinedinAが実際にテスト対象である場合は、そうする必要がありundefinedます。(A.indexOf('undefined')もちろん、配列に文字列がない限り機能しません"undefined"。)

通常、これは次のように出力されます3

var A = ["1111", "22", "33", undefined, "55", undefined] ;
console.log(A.indexOf(undefined));

ただし、そうではないとおっしゃっていますが、そうでない可能性のある理由とその対処方法を次に示します。

  1. 存在しない配列要素indexOfの値を見つけることを期待しています。undefinedたとえば、そうではありません

    var A = ["1111", "22", "33", undefined, "55", undefined] ;
    console.log(A.indexOf(undefined)); // 3
    

    ...代わりに:

    var A = [];
    A.length = 6;
    A[0] = "1111";
    A[1] = "22";
    A[2] = "33";
    A[4] = "55";
    console.log(A.indexOf(undefined)); // -1
    

    その理由は、値を持つ要素を実際に持つ配列と、その要素をまったくundefined持たない配列には違いがあるためです。JavaScript 配列は疎である可能性があります。つまり、配列にギャップがあります。(実際、JavaScript 配列は実際にはまったく配列ではありません。) これらのギャップは によってスキップされます。indexOf

    undefinedまたはギャップを見つけたい場合は、for ループを使用できます。

    var i, index = -1;
    for (i = 0; i < A.length; ++i) {
        if (A[i] === undefined) {
            index = i;
            break;
        }
    }
    

    これは、次の 2 つの理由のいずれかでA[i]評価されるため、機能します。A) 要素が存在し、値が含まれている、または B) 要素がまったく存在しない。undefinedundefined

  2. A別のウィンドウから取得しました。悲しいことに、undefinedは別のウィンドウでwindowはなく===、を使用します。その場合、代わりに使用できます (ES5 を搭載した最新のブラウザー、または ES5 shim を使用):undefinedindexOf===some

    var A = /* ...get A from another window... */;
    var index = -1;
    A.some(function(val, i) {
        if (typeof val === "undefined") {
            index = i;
            return true;
        }
    });
    console.log(index); // 3
    

    または単なるforループ:

    var i, index = -1;
    for (i = 0; i < A.length; ++i) {
        if (typeof A[i] === "undefined") {
            index = i;
            break;
        }
    }
    

    undefinedあるウィンドウには別のウィンドウにはありませんが=== undefined、両方に がtypeof "undefined"あるため、上記はその問題を回避します。

  3. Array#indexOf無意識のうちに独自の壊れたバージョンに置き換えるライブラリを含めています。これを行うことで、それが事実であるかどうかを確認できます。

    console.log(A.indexOf);
    

    おおよそ次のように表示されます。

    function indexOf() {
        [native code]
    }
    

    代わりに実際のソース コードが表示されている場合は、誰かがそれをシム処理しています (おそらく、ブラウザーに既にソース コードがあるかどうかを最初に確認せずにシム処理を行っている可能性もあります)。彼らが持っていて、このように壊れている場合は、そのライブラリの使用をやめてください。:-)

  4. 一部の eejit はundefined、たとえば次のように、コンテキストの 1 つで再定義されています。

    var A = ["1111", "22", "33", undefined, "55", undefined] ;
    (function(undefined) {
        console.log(A.indexOf(undefined)); // Outputs -1
    })("foo"));
    

    または

    var A = (function(undefined) {
        return ["1111", "22", "33", undefined, "55", undefined] ;
    ])("foo");
    console.log(A.indexOf(undefined)); // Outputs -1
    

    彼らがそれをした場合は、彼らを追跡してむち打ちます。

于 2012-06-20T13:24:04.153 に答える
0

未定義のアイテムをすべて削除しようとしている場合は、次の方法でかなり高速に実行できると思います。

var A = ["1111", "22", "33", undefined, "55", undefined];

var item = undefined; // value of the item to remove, it can be anything actually

while (A.indexOf(item) > -1) {
 dataArr.splice(A.indexOf(item), 1);
}

console.log(A); // output
于 2012-08-09T21:01:50.583 に答える