1

JSON入力データから、そのグループの子を含む特定のグループに属するデータを返す関数をJavaScriptで記述しようとしています。データは次のようになります。

            [
            {"id":"0", "name":"Person 0"},
            {"id":"1", "name":"Person 1","group":"0"},
            {"id":"2", "name":"Person 2","group":"0"},
            {"id":"3", "name":"Person 3","group":"2"},
            {"id":"4", "name":"Person 4","group":"2"},
            {"id":"5", "name":"Person 5","group":"4"},
            {"id":"6", "name":"Person 6","group":"4"},
            {"id":"7", "name":"Person 7","group":"0"},
            {"id":"8", "name":"Person 8","group":"7"}
            ]

ここで、グループxの人は、IDxの人と同じグループに属しています。

例:function(data、group)は、function(data、2)に対して次を返します。

            [
            {"id":"3", "name":"Person 3","group":"2"},
            {"id":"4", "name":"Person 4","group":"2"},
            {"id":"5", "name":"Person 5","group":"2"},
            {"id":"6", "name":"Person 6","group":"2"},
            ]

およびfunction(data、0):

            [
            {"id":"1", "name":"Person 1","group":"1"},
            {"id":"2", "name":"Person 2","group":"2"},
            {"id":"3", "name":"Person 3","group":"2"},
            {"id":"4", "name":"Person 4","group":"2"},
            {"id":"5", "name":"Person 5","group":"2"},
            {"id":"6", "name":"Person 6","group":"2"},
            {"id":"7", "name":"Person 7","group":"7"},
            {"id":"8", "name":"Person 8","group":"7"}
            ]

配列をループしようとしましたが、サブグループを処理しないので、再帰的に実行する必要があると思いますか?

4

3 に答える 3

2

.reduce()データ配列を作成し、サブグループに連結することができます。

function dataForGroup(data, group, refs) {
    if (!refs)
        refs = {};

       // check if it's in the list
    if (refs[group] === true)
        return []; // or you can throw an Error
    else
        refs[group] = true; // first encounter, so add it to the list

    return data.reduce(function(res, obj) {
        return obj.group == group ? 
                   res.concat(obj, dataForGroup(data, obj.id, refs)) : res;
    }, []);
}

循環参照がないことを願っています!

出力がわかりませんがgroup(data, 0)、サブグループのデータは表示されません。

于 2012-10-08T22:17:44.947 に答える
1

データ配列全体を反復処理し、同じグループのアイテムを除外します。

    var newArr = [],
    isVisted = []; // using to prevent circular reference.

function getGroup(data, groupId, inside) {
    if (!inside) {
        newArr = [];
        isVisted = [];
    }
    if (isVisted.indexOf(groupId) !== -1) {
        return
    };
    for (var k = 0; k < data.length; k++) {
        if (data[k].group == groupId) {
            newArr.push(data[k])
            getGroup(data, data[k].id, true);
        }
    }

    return newArr;
}

jsfiddleデモ

于 2012-10-08T22:17:15.310 に答える
0

あなたがjavascriptを使うと言ったので、私はjavascriptだけでそれをしました。ただし、jqueryでそのようなことを行うためのより簡単な方法があります。私はそれをテストしませんでした、ただそれを書いたので、それが何か問題であったならば、それについてコメントすることを躊躇しないでください。

function Group(data)
{
    var result = [];

    for (var item in data)
    {
        var group = (item.group) ? item.group : -1;

        if (!result[group])

            result[group] = [];

        result[group].push(item);
    }

    return result;
}

var secondGroup = Group(
    [
        {"id":"0", "name":"Person 0"}, 
        {"id":"1", "name":"Person 1","group":"0"}, 
        {"id":"2", "name":"Person 2","group":"0"}, 
        {"id":"3", "name":"Person 3","group":"2"}, 
        {"id":"4", "name":"Person 4","group":"2"}, 
        {"id":"5", "name":"Person 5","group":"4"}, 
        {"id":"6", "name":"Person 6","group":"4"}, 
        {"id":"7", "name":"Person 7","group":"0"}, 
        {"id":"8", "name":"Person 8","group":"7"} 
    ]
)[2];

乾杯

于 2012-10-08T22:20:17.397 に答える