0

JavaScript でネストされたオブジェクトに問題があります。オブジェクトのツリーを生成したいと思います。たとえば、次のようなツリーがあります。

var tree = {
    item1: {
        item11: {},
        item12: {}
    },
    item2: {
        item21: {
            item211: {},
            item212: {}
        }
    }
}

今、文字列にパスがあり(のように)、を使用してオブジェクトitem1.item11に入れたいと思います。item111treepath

treePush関数を呼び出した後、これが必要です:

var tree = {
    item1: {
        item11: {
            item111: {}
        },
        item12: {}
    },
    item2: {
        item21: {
            item211: {},
            item212: {}
        }
    }
}

今のところ、私はこのコードを持っていますが、これは新しいアイテムを目的のレベルではtreeなくルートに置きます:

//use example: treePush('item1.item11', 'item111', tree);

function treePush(path, value, tree) {
    var branch = getBranch(path, tree);

    branch[value] = {};
    $.extend(tree, branch);

    return tree;
}

function search(key, tree) {
    //searches key in tree and generates path like 'item1.item11'
}

function getBranch(path, tree) {
    var keys = path.split('.'),
        obj = tree,
        branch = {};

    for(var i = 0; i < keys.length - 1; i++) {
        var key = keys[i];

        if (obj[key] === undefined) {
            return {};
        }

        branch[key] = obj[key]; 
        obj = obj[key];
    }

    return branch;
};

treePush問題は関数 ( )の 5 行目にあると思いますが、機能branch[value] = {};させることができません。どんな助けでも感謝します。

4

2 に答える 2

0

あなたが述べたように、パス「item1.item11」を選択し、そこに指定された「item111」をプッシュします。これを機能させるには、プッシュするキー/値を指定するか、オブジェクトを指定して指定されたパスに混在させる必要があります。mixin アプローチでは $.extend メソッドに jQuery が必要ですが、これはあまり好きではありません (この単純なタスクを jQuery に依存するため)。

したがって、ここに両方の​​バージョンがあります。

jQuery mixin バージョン

var tree = {
    item1: {
        item11: {},
        item12: {}
    },
    item2: {
        item21: {
            item211: {},
            item212: {}
        }
    }
};

function treePush (tree, path, item) {
    var key, branch = tree;
    path = path.split('.');
    while (path.length) {
        key = path.shift();
        branch = branch[key] = branch[key] || {};
    }
    $.extend(branch, item);
}

treePush(tree, 'item1.item11', {item111: 'value'});
console.log(tree.item1.item11.item111 === 'value');

パスに対象キーを指定

var tree = {
    item1: {
        item11: {},
        item12: {}
    },
    item2: {
        item21: {
            item211: {},
            item212: {}
        }
    }
};

function treePush (tree, path, value) {
    var key, branch = tree;
    path = path.split('.');
    while (path.length > 1) {
        key = path.shift();
        branch = branch[key] = branch[key] || {};
    }
    branch[path.shift()] = value;
}

treePush(tree, 'item1.item11.item111', 'value');
console.log(tree.item1.item11.item111 === 'value');
于 2013-08-30T14:04:57.487 に答える