2

私は可変のjsonオブジェクトを持っています(おそらく無限のサブ構造を持っています):

var myObject={
    s1:{
        s2:'2',
        s3:'3'
    },
    s4:'4',
    s5:{
        s6:undefined
    },
    s7:'7'
};

最初の未定義のメンバーを見つけて、その参照を返し、いつでも変更できるようにしたい (イベントトリガー関数によって)

function findFirstUndefined(obj){
    for (var key in obj){
        if (typeof(obj[key]) === 'object'){
            var recursion=findFirstUndefined(obj[key])
            if (recursion!==false){
                return recursion;
            }       
        }
        else if (obj[key]===undefined){
            return obj[key];
        }   
    }
    return false; 
}

ただし、メンバーの参照は返されませんが、値は次のとおりです。

var subObj=findFirstUndefined(myObject);
subObj="my updated cool var!!";

オブジェクトを変更しません。

JsonPathのようなライブラリがそのトリックを実行できることがわかりましたが、そのような単純なタスクにはちょっと重いように思えます。

そうするためのエレガントな方法が存在しませんか?ありがとう!

4

5 に答える 5

5

JSはそれをしません。代わりに、不足しているエントリに割り当てる関数を返すことができますか?

return function(v) { obj[key] = v; };
于 2012-11-21T23:24:19.433 に答える
1

コメントでリクエストされたので、文字列パスに基づいてこれらのオブジェクトを取得/設定する方法を投稿します。もちろん複雑すぎると思うかどうかはあなた次第ですが、ここにあります。

function getValue(object, path) {
    value = object[path[0]];
    if (path.length > 1) {
        return getValue(value, path.slice(1, path.length))
    }
    return value;
}

function setValue(object, path, value) {
    if (path.length > 1) {
        setValue(object[path[0]], path.slice(1, path.length), value);
    }
    else {
        object[path[0]] = value
    }
}

次に、次のように使用します: getValue(myObject, ["s1", "s2"]);/ setValue(myObject, ["s1", "s2"], value);. コードをテストする機会はありませんでしたが、アプローチは維持されるはずです。

于 2012-11-24T16:23:06.010 に答える
1

JS では、値が渡されるか参照が渡されるかを手動で制御することはできません。

また、オブジェクトのみが参照によって渡されます。

残念ながら、それはできません。

于 2012-11-21T23:23:55.060 に答える
0
function findFirstUndefinedPath(obj){
    for (var key in obj){
        var path=[key];
        if (typeof(obj[key]) === 'object'){
            var subPath=findFirstUndefinedPath(obj[key]);
            if (subPath!==false){
                return path.concat(subPath);
            }       
        }
        else if (obj[key]===undefined){
            return path;
        }   
    }
    return false; 
}
于 2012-11-25T11:29:47.460 に答える
0

戻った場合、明らかに値を返しobj[key]ていますが、2 つの値の配列を返そうとすると[obj, key]、そのノードを参照する方法があります。または、再帰関数から、後で使用するために、これらの種類のペアで多次元配列を構築できます。

于 2012-11-21T23:25:37.733 に答える