Domanda

Simplified Version

for...

ar = [
        {"element":"a","index":0},
        {"element":"b","index":1},
        {"element":"e","index":4},
        {"element":"d","index":3}
];

should return...

 ans = [[
        {"element":"a","index":0},
        {"element":"b","index":1},
        {"element":"e","index":4}],

       [{"element":"a","index":0},
        {"element":"b","index":1},
        {"element":"d","index":3}]
 ];

It could return arrays of just {"element":"e","index":4} and just {"element":"d","index":3} since there is nothing behind it, but it's not necessary.

Original I have this array of elements...

ar = [
        {"element":"c","index":2},
        {"element":"a","index":0},
        {"element":"b","index":1},
        {"element":"e","index":4},
        {"element":"d","index":3}
];

I'd like to return an array of arrays which contain sequences where the "index"'s of each object grow progressively, and have the max number of objects for which obj1[index] < nextobj[index].

i.e. it should return..

[
    [{"element":"c","index":2}, {"element":"e","index":4}], 
    [{"element":"c","index":2}, {"element":"d","index":3}],
    [{"element":"a","index":0}, {"element":"b","index":1}, {"element":"d","index":3}], 
    [{"element":"a","index":0}, {"element":"b","index":1}, {"element":"e","index":4}]
    [{"element":"d","index":3}],
    [{"element":"e","index":4}]
]

I've tried using ar.reduce but am not that familiar with it and don't know if it's appropriate for this instance.

È stato utile?

Soluzione

Not sure why these are not listed in your example

[{ element="a", index=0}, { element="e", index=4}]
[{ element="a", index=0}, { element="d", index=3}]
[{ element="b", index=1}, { element="e", index=4}]
[{ element="b", index=1}, { element="d", index=3}]

but here is what could produce something close

var ar = [
        {"element":"c","index":2},
        {"element":"a","index":0},
        {"element":"b","index":1},
        {"element":"e","index":4},
        {"element":"d","index":3}
];

var results = [];

traverse([], 0);

function traverse(r, startIdx)
{
    if (startIdx >= ar.length){
        console.log(r);
        return;
    }

    for (var i = startIdx; i < ar.length ; i++){
        if ((startIdx == 0) || (r[r.length - 1].index) <= ar[i].index) {        
            rCopy = r.slice(0);
            rCopy.push(ar[i]);

            traverse(rCopy, i + 1);
        }
        else if (r.length > 0) {
            console.log(r);
        }
    }
}

JSFiddle1, JSFiddle2

var ar = [
        {"element":"c","index":2},
        {"element":"a","index":0},
        {"element":"b","index":1},
        {"element":"e","index":4},
        {"element":"d","index":3}
];

var results = [];

traverse([], 0);
collapse(results);

//console.log(results);

for (var i = results.length - 1; i >= 0; i--) {
    console.log(results[i]);
}

function traverse(r, startIdx) {
    if (startIdx >= ar.length) {
        results.push(r);
        return;
    }

    for (var i = startIdx; i < ar.length ; i++) {
        if ((startIdx == 0) || (r[r.length - 1].index) <= ar[i].index) {
            rCopy = r.slice(0);
            rCopy.push(ar[i]);

            traverse(rCopy, i + 1);
        }
        else if (r.length > 0) {
            results.push(r);
        }
    }
}

function collapse() {
    for (var i = results.length - 1; i >= 0; i--) {
        for (var j = results.length - 1; j >= 0; j--) {
            if ((i !== j) && (contains(results[i], results[j]))) {
                results[i].remove = true;
            }
        }
    }

    for (var i = results.length - 1; i >= 0; i--) {
        if (results[i].remove) {
            results.splice(i, 1);
        }
    }
}

// Checks if set1 is contained within set2
function contains(set1, set2) {
    for (var i = 0; i < set1.length; i++) {
        var found = false;

        for (var j = 0; j < set2.length; j++) {
            if (set1[i].index === set2[j].index) {
                found = true;
                break;
            }
        }

        if (!found) {
            return false;
        }
    }

    return true;
}

JSFiddle3

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top