3

不明なオブジェクトのJSON階層構造を作成したいので、再帰的に処理する必要があります。

これが私の関数です。ここでangular.element.isEmptyObject()、jQueryから継承されangular.copy()、オブジェクトのディープコピーを作成する関数です(私はAngularJSを使用しています)。

function recurseTree(tree, newKey, newId) {
    if(angular.element.isEmptyObject(tree)) {
        tree[newKey] = {_id: newId};
    } else {
        for(var key in tree) {
            if(typeof tree[key] == 'object') recurseTree(tree[key], newKey, newId);
            else tree[newKey] = {_id: newId};
        }
    }
    return angular.copy(tree);
}

今これを実行します:

var testT = {};
console.log(recurseTree(testT, 'a', '1'));
console.log(recurseTree(testT, 'b', '2'));
console.log(recurseTree(testT, 'c', '3'));
console.log(recurseTree(testT, 'd', '4'));
console.log(recurseTree(testT, 'e', '5'));

1番目と2番目のものが期待どおりに戻ることに気付くでしょう。

{ 
    a: { 
        _id: '1',
        b: {
            _id: '2'
        }
    }
}

しかし、3つ目は私が問題にぶつかったところです。

{ 
    a: { 
        _id: '1',
        b: {
            _id: '2',
            c: {
                _id: '3'
            }
        },
        c: {
            _id: '3'
        }
    }
}

オブジェクトをの子としてではなく、の子としてのみc追加するには、何を修正する必要がありますか?私は困惑しています。ba

これが実際のJSFiddleです。コンソールで結果を確認してください。 http://jsfiddle.net/winduptoy/Mjq5D/2/

4

3 に答える 3

3

これを試して:

function recurseTree(tree, newKey, newId) {
    if(angular.element.isEmptyObject(tree)) {
        tree[newKey] = {_id: newId};
        return;
    } 

    var child = null; // find current tree's child
    for(var key in tree) {
        if (key != '_id') {
            child = tree[key]; // found a child
            break;
        }
    }
    if (child) { // recursively process on child
        recurseTree(child, newKey, newId);
    } else { // no child, so just fill the tree
        tree[newKey] = {_id: newId};
    }
}

テスト:

var testT = {};
recurseTree(testT, 'a', '1');
console.log(testT);  
recurseTree(testT, 'b', '1');
console.log(testT); 
recurseTree(testT, 'c', '1');
console.log(testT); 
recurseTree(testT, 'd', '1');
console.log(testT); 
recurseTree(testT, 'e', '1');
console.log(testT);

angular.copy(tree)公演のために使用したことはありませんのでご了承ください。ツリーを変更したくない場合は、関数に渡す前にツリーをコピーしてrecurseTreeください。jsFiddleでお試しください。

于 2012-12-30T04:13:49.833 に答える
1

試してみませんか?使用する必要がありますfor loopか?

for(var key in tree) {
   if(typeof tree[key] == 'object'){ 
       recurseTree(tree[key], newKey, newId);
       break;
   }
   else {
       tree[newKey] = {_id: newId};
       break;
   }
}
于 2012-12-30T03:12:06.377 に答える
0

私の解決策:

vm.getChilds = function (data, parent_id) {
        return _.filter(data, function (item) {
            return item.parent_id == parent_id;
        });
    };
    vm.getIds = function (arr) {
        var ids = [];
        arr.forEach(function (item) {
            ids.push(item.id);
        });
        return ids;
    };
    vm.updateList = function (data, arr) {
        var ids = vm.getIds(arr);
        var result = [];
        data.forEach(function (item) {
            if (ids.indexOf(item.id) == -1) {
                result.push(item);
            }
        });
        return result;
    };
    vm.getThree = function (data, parent_id) {
        var items = vm.getChilds(data, parent_id);
        if (items.length == 0) return null;
        var tree = [];
        var newData = vm.updateList(data, items);
        items.forEach(function (item) {
            item.sub_departments = vm.getThree(newData, item.id);
            tree.push(item);
        });
        return tree;
    };
于 2017-07-27T06:09:20.950 に答える