2

親プロパティが存在しない場合にエラーをスローするのではなく、jsが未定義を返すようにするための最良の方法は何ですか?

a = {}
b = a.x.y.z
// Error: Cannot read property 'value' of undefined
// Target result: b = undefined
4

4 に答える 4

3

各プロパティの存在を確認する必要があります。

var b;
if (a.x && a.x.y && a.x.y.z) {
    b = a.x.y.z
}

または、別の投稿者の「safeGet」関数と同様です。

var get = function (obj, ns) {
    var y = ns.split('.');
    for(var i = 0; i < y.length; i += 1) {
        if (obj[y[i]]) {
            obj = obj[y[i]];
        } else {
            return;
        }
    }
    return obj;
};

使用する:

var b = get(a, 'x.y.z');
于 2012-06-07T17:14:23.657 に答える
2
try {
  a = {}
  b = a.x.y.z
}
catch (e) {
  b = void 0;
}
于 2012-06-07T17:07:57.270 に答える
2

私は少し冗長に行きます:

var b = ((a.x || {}).y || {}).z
于 2012-06-07T17:11:10.113 に答える
1

safeGet次のようなヘルパー関数を作成できます。

arcyqwertyによるコメントで提案されているようにドリルダウン用に編集

var getter = function (collection, key) {
    if (collection.hasOwnProperty(key)) {
        return collection[key];
    } else {
        return undefined;
    }
};

var drillDown = function (keys, currentIndex, collection) {
    var max = keys.length - 1;
    var key = keys[currentIndex];

    if (typeof collection === 'undefined') {
        return undefined;   
    }

    if (currentIndex === max) {
        return getter(collection, key);
    } else {
        return drillDown(keys, currentIndex + 1,
                         getter(collection, key));
    }
};

var safeGet = function (collection, key) {
    if (key.indexOf(".") !== -1) {
        return drillDown(key.split("."), 0, collection);
    } else {
        return getter(collection, key);
    }
};

a = { x: 1 };
b = safeGet(a, 'x.y.z');

http://jsfiddle.net/YqdWH/2/

于 2012-06-07T17:17:49.867 に答える