From data 1:n to 1:n in reverse order

Hi
From


var stack = [
    {user:'Joe',items:[1,2,3]},
    {user:'Bob',items:[3,4,5,6]},
    {user:'Joy',items:[1,4,7,9,10]},
    {user:'Bill',items:[6,8,3]},
    {user:'Elen',items:[9,7,1,4]}
];

to


var stack = [
    {id:1,users:['Joe','Joy','Elen']},
    // and go on
];

I’ve ended up with


function inArray(needle, haystack) {
    var length = haystack.length;
    for(var i = 0; i < length; i++) {
        if(haystack[i] == needle) return true;
    }
    return false;
}

function builder(stack){
    var temp =[],items = [];
    for(var key in stack){
        var len = stack[key].items.length;
        if(len > 0){
            for(var i = 0; i < len; i++){
                if(!inArray(stack[key].items[i],temp)){
                    temp.push(stack[key].items[i]);
                    items.push({id:stack[key].items[i],users:[stack[key].user]});
                }
                else{
                    for(var k in items) {
                        if(items[k].id == stack[key].items[i]){
                           items[k].users.push(stack[key].user);
                        }
                    }
                }
            }
        }
    }
    return items;
 }
console.log(builder(stack));

As usual is there a better way ?
:slight_smile:

Bye

This could be a good time to make use of some higher level array methods, such as .forEach() and [url=“https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/some”].some()

After reordering things to remove the need for the temp array, here’s what we get:


function builder(stack) {
    var items = [];
    stack.forEach(function (obj) {
        obj.items.forEach(function (stackItem) {
            var found = items.some(function (item) {
                if (item.id == stackItem) {
                    item.users.push(obj.user);
                    return true;
                }
            });
            if (!found) {
                items.push({
                    id: stackItem,
                    users: [obj.user]
                });
            }
        });
    });
    return items;
}

The above links provide compatibility code too, which you’ll need if using them outside of modern web browsers (such as for IE).

:slight_smile: