親プロパティが存在しない場合にエラーをスローするのではなく、jsが未定義を返すようにするための最良の方法は何ですか?
例
a = {}
b = a.x.y.z
// Error: Cannot read property 'value' of undefined
// Target result: b = undefined
親プロパティが存在しない場合にエラーをスローするのではなく、jsが未定義を返すようにするための最良の方法は何ですか?
例
a = {}
b = a.x.y.z
// Error: Cannot read property 'value' of undefined
// Target result: b = undefined
各プロパティの存在を確認する必要があります。
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');
try {
a = {}
b = a.x.y.z
}
catch (e) {
b = void 0;
}
私は少し冗長に行きます:
var b = ((a.x || {}).y || {}).z
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');