Ich versuche, eine Funktion in Javascript zu schreiben, die aus JSON-Eingabedaten die Daten zurückgibt, die zu einer bestimmten Gruppe gehören, einschließlich der untergeordneten Elemente dieser Gruppe. Die Daten sehen folgendermaßen aus:

            [
            {"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"}
            ]

Hier gehört eine Person in Gruppe x zur selben Gruppe wie eine Person mit der ID x.

Beispiel: function (data, group) würde für function (data, 2) Folgendes zurückgeben:

            [
            {"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"},
            ]

Und Funktion (Daten, 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"}
            ]

Ich habe versucht, das Array zu durchlaufen, aber das betrifft nicht die Untergruppen. Ich denke, ich muss es rekursiv tun.

1
graphmeter 9 Okt. 2012 im 02:12

3 Antworten

Beste Antwort

Sie können das Datenarray .reduce() und in den Untergruppen verketten.

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;
    }, []);
}

Hoffentlich gibt es keine Zirkelverweise!

Obwohl ich die Ausgabe von group(data, 0) nicht verstehe und keine Untergruppendaten sehe.

2
I Hate Lazy 8 Okt. 2012 im 23:32

Weil Sie sagten, dass Sie Javascript verwenden, habe ich es nur mit Javascript gemacht. Es gibt jedoch einfachere Möglichkeiten, so etwas in jquery zu tun. Ich habe es nicht getestet, sondern nur geschrieben. Wenn es also ein Problem gab, zögern Sie nicht, es zu kommentieren.

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];

Prost

0
Rikki 8 Okt. 2012 im 22:20

Durchlaufen Sie das gesamte Datenarray und filtern Sie Elemente mit derselben Gruppe heraus.

    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 Demo

1
Anoop 8 Okt. 2012 im 23:09