3

次のようなJavaScriptオブジェクトがあるとします。

var obj = {};
obj.computers = {};
obj.computers.favorite = "Commodore 64";
obj.computers.popular = "Apple";

これで、次のようにnullを簡単に確認できます。

if(obj != 'undefined' && obj != null) {
    if(obj.computers != 'undefined' && obj.computers != null)) {
        .....

ご覧のとおり、obj.computers.favorite設定されているかどうかを確認する必要がある場合は、条件付きロジックを実際にネストする必要があります。一部のオブジェクトは、3、4、5レベルの深さになります。

これが私がしたいことです:

var fav = obj.computers.favorite || 'Unknown';

しかし、私はそれを何らかの方法でラップする必要があることを理解しています。何かのようなもの:

var fav = getValueOrDefault(obj.computers.favorite, 'Unknown');

提案をいただければ幸いです。

ありがとう

編集

'undefined'のチェックは、実際には私が使用しているものではありません。質問をすると頭から浮かびました。笑

しかし、私は疑問に思っていました。try/ catchでラップして、例外の場合はデフォルトをスローできますか?

function(obj, default) {
    try {
        if(obj != null) {
            return obj;
        } else {
            return default;
        }
    } catch(ex) {
        return default;
    }
}

また、冗長な変数を指定してくれたShusiに感謝します。

4

7 に答える 7

6

あなたは本当に書くことができます:

(obj && obj.computers && obj.computers.favorite) || 'Unknown'
于 2012-10-01T20:25:05.117 に答える
3

「 obj.computers.favorite が設定されているかどうかを確認する必要があります」という質問の 1 つに対処するために、これを書きました。

Object.prototype.isset = function (/* string */ full_path)
{
    var props = full_path.split('.');
    var self = this; /* note that self is usually the window object */

    for (var ii = 0; ii < props.length; ++ii)
    {
        var prop = props[ii];
        var hasMoreComing = ii < props.length - 1 ? true : false;

        if (self[prop] !== null && typeof self[prop] === 'object' && hasMoreComing)
        {
            self = self[prop];
            continue;   // Move up one level.
        }
        else if (hasMoreComing)
            return false;    // ..because user queries a subproperty of a value type

        return self.hasOwnProperty(prop);
    }
};

テストコード:

var test = {};

test.kuk = {};
console.log( test.isset('kuk') );  // Prints true.

test.kuk.fitta = {};
console.log( test.isset('kuk.fitta') ); // Prints true.

test.kuk.fitta = null;
console.log( test.isset('kuk.fitta') ); // Prints true.

test.kuk.fitta = undefined;
console.log( test.isset('kuk.fitta') );  // Prints true

delete test.kuk.fitta;
console.log( test.isset('kuk.fitta') );  // Prints false

test.kuk.fitta = 123;
console.log( test.isset('kuk.fitta.doesnt.exist') );  // Prints false
于 2012-10-01T21:07:36.993 に答える
3

ヘルパー関数でそれを行うことができます。あなたの問題を正しく理解していれば、あなたのオブジェクトには任意の深いオブジェクトが含まれている可能性があり、コードを乱雑にすることなく、これらの任意のネストされたプロパティにアクセスしたいと考えています。任意のプロパティが設定されている場合は任意のプロパティ、設定されていない場合はデフォルトを許可するNested関数を作成しました。get()

var Nested = function() {};
// prop is a dot-separated path like "foo.bar.baz"
Nested.prototype.get = function(prop, _default) {
    var current = this;
    $.each(prop.split("."), function(i, e) {
        current = current[e] || undefined;
        if (current == undefined)
            return false;
    });
    return current || _default;
}

次に、このようなコードを書くことができます

var fav = obj.get("computers.favourite", "Linux");
// this emulates
var fav = obj.computers.favourite || "Linux"; // throws error

ご覧のとおり、タイピングはそれほど多くありません。確かに、それは通常の Javascriptのようには感じません...ここにフィドルがあります。

于 2012-10-01T20:46:39.500 に答える
1

次の関数は文字列をパラメーターとして受け取り、存在する場合はオブジェクトを返します

 function getValueOrDefault(str , obj, deflt){
    var a = str.split("."); o = obj;
    for(var i =0; i < a.length; i++){
         o = obj[a[i]];
         if(!o){
           return deflt;
         }
    }
      return o;
}

var obj = {};
obj.computers = {};
obj.computers.favorite = "Commodore 64";
obj.computers.popular = "Apple";
getValueOrDefault('computers.favorite', obj, 'Unknown');

注: オブジェクトにプロパティを割り当てるときに var を使用しないでください。var obj.computers.favorite SYNTAXエラーです。

于 2012-10-01T20:25:05.767 に答える
1

残念ながら、これを回避するための非常に簡単な方法はありませんが、null と undefined の両方をチェックする必要はありません。null と undefined はどちらも偽なので、次のようにするだけです。

if (obj && obj.computers) {
  var fav = obj.computers.favorite || 'unknown';
}

それは実際にあなたの不満が何であるかを回避するわけではありませんが、あなたが思っているよりも痛みは少ないです.

于 2012-10-01T20:25:42.257 に答える