texas697
texas697

Reputation: 6397

How to loop through 2 object arrays and merge by matching id

I found some examples and got this to almost work. I am trying to compare 2 object arrays:

    var responseExercises = [{
  "exerciseId": 44,
  "exerciseName": "Double Leg Press with Treading",
  "exerciseBenefits": "Core Control, Axial Elongation",
  "exerciseSprings": [],
  "isHidden": false,
  "workoutId": null,
  "workouts": [],
  "exerciseImages": [],
  "exerciseRepetitions": []
}, {
  "exerciseId": 46,
  "exerciseName": "Bent Arm Arcs with Quarter Circles",
  "exerciseBenefits": "Improved Posture, Upper Torso Alignment",
  "exerciseSprings": [],
  "isHidden": false,
  "workoutId": null,
  "workouts": [],
  "exerciseImages": [],
  "exerciseRepetitions": []
}, {
  "exerciseId": 47,
  "exerciseName": "Bridging with Leg Press",
  "exerciseBenefits": "Spine Articulation, Upper Torso Alignment",
  "exerciseSprings": [],
  "isHidden": false,
  "workoutId": null,
  "workouts": [],
  "exerciseImages": [],
  "exerciseRepetitions": []
}];

var responseSprings = [{
  "clientExerciseSpringId": 1,
  "clientExerciseSpringCount": "2",
  "clientExerciseSpringColor": "blue",
  "clientExerciseSpringLevel": "bottom",
  "exerciseId": 44,
  "clientWorkoutId": 4,
  "clientWorkout": null
}, {
  "clientExerciseSpringId": 2,
  "clientExerciseSpringCount": "1",
  "clientExerciseSpringColor": "blue",
  "clientExerciseSpringLevel": "bottom",
  "exerciseId": 44,
  "clientWorkoutId": 4,
  "clientWorkout": null
}, {
  "clientExerciseSpringId": 3,
  "clientExerciseSpringCount": "2",
  "clientExerciseSpringColor": "yellow",
  "clientExerciseSpringLevel": "bottom",
  "exerciseId": 46,
  "clientWorkoutId": 4,
  "clientWorkout": null
}, {
  "clientExerciseSpringId": 4,
  "clientExerciseSpringCount": "1",
  "clientExerciseSpringColor": "yellow",
  "clientExerciseSpringLevel": "top",
  "exerciseId": 46,
  "clientWorkoutId": 4,
  "clientWorkout": null
}, {
  "clientExerciseSpringId": 5,
  "clientExerciseSpringCount": "2",
  "clientExerciseSpringColor": "blue",
  "clientExerciseSpringLevel": "bottom",
  "exerciseId": 47,
  "clientWorkoutId": 4,
  "clientWorkout": null
}];

I need to push the responseSprings into there matching responseExercise. The result I am getting now is if there are multiple matching exerciseSprings only 1 of them is being pushed into the

responseSprings.responseSprings

array. I am using underscore in the project so can use that if better solution.

fiddle

    vm.combineResponse = function(responseExercises, responseSprings) {
  console.log($.map(responseExercises, function(exercise) {
    var spring = $.grep(responseSprings, function(spring) {
      return spring.exerciseId === exercise.exerciseId;
    })[0];
    exercise.exerciseSprings.push(spring);
    return exercise;
  }));
};

vm.combineResponse(responseExercises, responseSprings)

Upvotes: 0

Views: 86

Answers (1)

1cgonza
1cgonza

Reputation: 1588

How about using for loops? seems simple enough to do without a library.

for (var i = 0; i < responseExercises.length; i++) {
    var exercise = responseExercises[i];
    var id = exercise.exerciseId;

    for (var j = 0; j < responseSprings.length; j++) {
        var spring = responseSprings[j];
        if (spring.exerciseId == id) {
            exercise.exerciseSprings.push(spring);
        }
    }
};

console.log(responseExercises);

Upvotes: 1

Related Questions