4

複雑なオブジェクトチェーンに欠落しているオブジェクトがないか確認したいと思います。私は次の解決策を思いついた、同じことを達成するためのより良い方法はありますか?

var lg = console.log;
var t = { a:{a1: 33, a12:{ aa1d: 444, cc:3 } }, b:00};
var isDefined = function(topObj, propertyPath) {
    if (typeof topObj !== 'object') {
        throw new Error('First argument must be of type \'object\'!');
    }
    if (typeof propertyPath === 'string') {
        throw new Error('Second argument must be of type \'string\'!');
    }
    var props = propertyPath.split('.');
    for(var i=0; i< props.length; i++) {
        var prp = props[i];
        lg('checking property: ' + prp); 
        if (typeof topObj[prp] === 'undefined') {
            lg(prp + ' undefined!');
            return false;
        } else {
           topObj = topObj[prp];
        }        
    }
    return true;
}
isDefined(t, 'a.a12.cc');
4

3 に答える 3

7

次のように、関数をより簡単に定義できます。

var isDefined = function(value, path) {
  path.split('.').forEach(function(key) { value = value && value[key]; });
  return (typeof value != 'undefined' && value !== null);
};

jsfiddleでの作業例。

于 2013-03-07T23:28:26.713 に答える
3

あなたのコンセプトはOKですが、コードを変更する必要があります。プロパティにnull値がある場合、プロパティを持つことはできません。のプロパティにアクセスしようとするとnull、エラーが発生します。これを修正するには、次を使用します。

for (var i=0; i<props.length; i++) {
    var prp = props[i],
        val = topObj[prp];
    lg('checking property: ' + prp); 
    if (typeof val === 'undefined') {
        lg(prp + ' undefined!');
        return false;
    } else if (val === null) {
        return i === props.length-1; // True if last, false otherwise
    } else {
        topObj = val;
    }
}
于 2012-07-27T14:38:06.227 に答える
0

理論で一度学んだように、単純にしてください。カスタム関数内でスローされた例外を試行/キャッチします。

let obj1 = {
    x: {
        y: 10
    }
};

export function def(chain){
    try{
        let lookup = eval(chain);
        return true;
    } catch (e){
        return false;
    }
}

//true
document.write(def('obj1.x.y'));
//false (at any moment in the given chain)
document.write(def('obj1.k.v'));
于 2020-01-09T12:53:47.547 に答える