Question

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.

Was it helpful?

Solution

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

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top