1

RSS フィードからコンテンツを挿入しようとしています - 問題は、RSS フィードごとに画像、コンテンツなどの形式が異なることです。

特定のオブジェクトがjavascriptまたはjqueryに存在するかどうかを確認しようとしています:

item.mediaGroups[0].contents[0].url

if文で確認するにはどうすればよいですか?この構造なしでフィードを取得し続けます:

Uncaught TypeError: Cannot read property '0' of undefined 

また試しました:

if (typeof item.mediaGroups[0].contents[0].url === "undefined")

しかし、同じエラーが発生し続けます。

ありがとう!

4

6 に答える 6

6

この種の詳細なチェックを行うための「単純な」組み込み方法はありません。理由は単純です。ほとんどの場合、対象となるオブジェクトのタイプはわかっています。

できるよ:

if (typeof item !== "undefined" &&
    typeof item.mediaGroups !== "undefined" &&
    typeof item.mediaGroups[0] !== "undefined" &&
    typeof item.megiaGroups[0].contents !== "undefined" &&
    typeof item.megiaGroups[0].contents[0] !== "undefined" &&
    typeof item.mediaGroups[0].contents[0].url !== "undefined"){

データ構造を考慮したいかもしれないすべてを入力するとき、これは実際には最初からすべき状況ではないので:)

(ヒント、最初以外はすべて typeof をスキップできますが、ここでは typeof が適切な説明になると思います)。

本当の質問はこれです:

データの構造がわからないのはなぜですか?

データ (RSS フィードの XML など) をクエリする場合、XPATH またはクエリ セレクターを使用して効率的に行う方法があります。オブジェクト プロパティ アクセスは、クエリ対象がドキュメントであるオブジェクト用に構築されています。確かに、重いドライバーで釘を打つことができるのと同じように、醜いチェックの束でそれは可能です.

DOM メソッドを使用して XML を解析する方法については、Stack Overflow でこの質問を確認できます。

于 2013-07-28T19:04:38.343 に答える
1

プロパティの存在が不明な場合は、次のヘルパー関数を試してください。

function getProperty(root) {
    var l = arguments.length, i, undefined;
    for( i=1; i<l; i++) {
        if( typeof root[arguments[i]] == "undefined") return undefined;
        root = root[arguments[i]];
    }
    return root;
}

次に、次のように呼び出すことができます。

var url = getProperty(item,'mediaGroups',0,'contents',0,'url');

より「厄介な」方法として、これを試すことができます:

try {url = item.mediaGroups[0].contents[0].url;}
catch(e) {url = undefined;}
于 2013-07-28T19:04:28.747 に答える
1

この場合、確実に両方の配列の長さを確認します-インデックス0で定義されたオブジェクトがあると仮定する前に

item.mediaGroups.length > 0

and

item.mediaGroups[0].contents.length > 0

外側のチェックとして、

if(item.mediaGroups){
} 
于 2013-07-28T19:04:42.740 に答える
-1

item.mediaGroups[0].contentsundefined、確認する必要があります。

if(item.mediaGroups && item.mediaGroups[0].contents) {
    return item.mediaGroups[0].contents[0].url;
}
于 2013-07-28T19:05:28.550 に答える
-1

これは (要求された) if ステートメントを使用したソリューションではありませんが、例外を使用して同様の機能を実現できます。このようなもの:

function throwOrReturn(thing){

    if(typeof thing === 'undefined'){

        throw "Didn't find it..."

    }else{

        return thing

    }

}

// The unknown thing.
var a = {
    b1: {
    },
    b2: {
        c: 'lookingFor'
    }
}

var c

// Test our different paths.
try{

    // First guess.
    c = throwOrReturn(a.b1.c.d)+" - a.b1.c.d"

}catch(error){

    try{

        // Second guess.
        c = throwOrReturn(a.b[45][34].c)+" - a.b[45][34].c"

    }catch(error){

        try{

            // Third guess.
            c = throwOrReturn(a.b2.c)+" - a.b2.c"

        }catch(error){

            // Try more guesses, or give up.
            c = "notFound"

        }

    }

}

console.log("c:", c) // Logs: "c: lookingFor - a.b2.c" 

きれいではありませんが、言及する価値のある代替手段です。

于 2013-07-28T19:59:11.807 に答える