tony yew
tony yew

Reputation: 51

loop and put array within array according to id failed

http://jsfiddle.net/rw0z9e2j/

var sports = [{
    "id": 1,
        "name": "baseball"
}, {
    "id": 2,
        "name": "Football"
}];

var playersData = [{
    "sport_id": 2,
        "id": "nv12",
        "name": "James"
}, {
    "sport_id": 2,
        "id": "nv11",
        "name": "Jean"
}];

var arr = [],
    tempObj = {};

$.each(sports, function (i, obj) {
    var sport_id = obj.id;

    $.each(playersData, function (i, obj) {
        if (sport_id == obj.sport_id) {
            tempObj = {
                "sport_id": obj.sport_id,
                    "id": obj.id,
                    "name": obj.name
            };
            arr.push(tempObj);
        }

    });
    obj.players = arr;
});

console.log(sports);

I try to build an array of players and put them within sports group according to sport_id but above logic has failed. It didn't group properly, the player who's in sport_id = 1 should go to sport which its id = 1 but why it didn't?

what's wrong with above loop there?

Upvotes: 1

Views: 62

Answers (4)

vinodh
vinodh

Reputation: 724

Hope you want to put inside the Sports group, but you are adding inside the player array, please notice, so please call

obj.sports = arr;

Hope it solve your problem .

Upvotes: 0

Jai
Jai

Reputation: 74738

You have to put it after push:

arr.push(tempObj);
obj.players = arr;

Actually you need this:

var sports = [{
    "id": 1,
        "name": "baseball"
}, {
    "id": 2,
        "name": "Football"
}];

var playersData = [{
    "sport_id": 2,
        "id": "nv12",
        "name": "James"
}, {
    "sport_id": 2,
        "id": "nv11",
        "name": "Jean"
}];

var arr = [];

$.each(sports, function (i, obj) {
    $.each(playersData, function (i, player) {
        if (obj.id === player.sport_id) {
           var tempObj = {
                "sport_id": player.sport_id,
                    "id": player.id,
                    "name": player.name
            };
            arr.push(tempObj);
            obj.players = arr;
        }

    });
    
});

console.log(sports);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Upvotes: 0

Sam Ternent
Sam Ternent

Reputation: 281

You're declaring your temp vars outside of your loops, these should be scoped to your loops and thrown away after each operation.

var arr = [],
    tempObj = {};

http://jsfiddle.net/samternent/rw0z9e2j/2/

Upvotes: 1

Nina Scholz
Nina Scholz

Reputation: 386620

I suppose this is what you want:

var sports = [{
    "id": 1,
    "name": "baseball"
}, {
    "id": 2,
    "name": "Football"
}];

var playersData = [{
    "sport_id": 2,
    "id": "nv12",
    "name": "James"
}, {
    "sport_id": 2,
    "id": "nv11",
    "name": "Jean"
}];

sports.forEach(function (a) {
    var arr = [];
    playersData.forEach(function (b) {
        if (a.id == b.sport_id) {
            arr.push(b);
        }
    });
    a.players = arr;
});

document.write('<pre>' + JSON.stringify(sports, 0, 4) + '</pre>');

Upvotes: 2

Related Questions