简体   繁体   中英

how to push array into object by matching ids

I am returning a object array from a api that contains a currentDataResult and a pastDataResult.

[
{
    "sectionCurrentDataResult": [
        {
            "section_id": 14785,
            "subdivision_name": "Stratton Woods",
        },
        {
            "section_id": 14790,
            "subdivision_name": "Stratton Woods",
        },
        {
            "section_id": 14791,
            "subdivision_name": "Stratton Woods"
        },
        {
            "section_id": 14792,
            "subdivision_name": "Stratton Woods"
        },
        {
            "section_id": 14781,
            "subdivision_name": "Stratton Woods"
        },
        {
            "section_id": 14786,
            "subdivision_name": "Stratton Woods"
        },
        {
            "section_id": 14787,
            "subdivision_name": "Stratton Woods"
        },
        {
            "section_id": 14788,
            "subdivision_name": "Stratton Woods"
        },
        {
            "section_id": 14782,
            "subdivision_name": "Stratton Woods"
        },
        {
            "section_id": 14783,
            "subdivision_name": "Stratton Woods"
        },
        {
            "section_id": 14784,
            "subdivision_name": "Stratton Woods"
        },
        {
            "section_id": 5326,
            "subdivision_id": 1439,
            "subdivision_name": "Stratton Woods"
        }
    ]
},
{
    "sectionPastDataResult": [
        {
            "section_id": 5326,
            "price_min": 177,
            "price_max": 235
        },
        {
            "section_id": 14785,
            "price_min": 190,
            "price_max": 220
        },
        {
            "section_id": 14786,
            "price_min": 238,
            "price_max": 292
        },
        {
            "section_id": 14788,
            "price_min": 186,
            "price_max": 205
        },
        {
            "section_id": 14790,
            "price_min": 150,
            "price_max": 269
        },
        {
            "section_id": 14783,
            "price_min": 150,
            "price_max": 260
        },
        {
            "section_id": 14787,
            "price_min": 90,
            "price_max": 90
        },
        {
            "section_id": 14792,
            "price_min": 177,
            "price_max": 235
        },
        {
            "section_id": 14791,
            "price_min": 145,
            "price_max": 221
        },
        {
            "section_id": 14784,
            "price_min": 148,
            "price_max": 186
        },
        {
            "section_id": 14781,
            "price_min": 155,
            "price_max": 200
        },
        {
            "section_id": 14782,
            "price_min": 150,
            "price_max": 170
        }
      ]
    }
  ]

I need to push the matching pastDataObject(by section_id) object into the currentDataResult object as a nested array. this is what it needs to look like

"sectionCurrentDataResult": [
        {
            "section_id": 14785,
            "subdivision_name": "Stratton Woods",
            "sectionHistory":[{
               "section_id": 14785,
               "price_min": 190,
               "price_max": 220
            }]
        },
        {
            "section_id": 14790,
            "subdivision_name": "Stratton Woods",
            "sectionHistory":[{
               "section_id": 14790,
               "price_min": 150,
               "price_max": 269
            }]
        },
        etc....
        ]

I have created a service that takes both the current and past data result and re-orders the past data result to match the current. what i need help with is pushing the past data array into the current data object. right now it is incorrectly pushing the entire past data array into the first object into the current data array.I have setup a plunker with my code.

plunker

app.controller('MainCtrl', function($scope,bigEnchilada,inputHistorySvc) {

   for (var i = 0; i < bigEnchilada[0].sectionCurrentDataResult.length; i++) {
        bigEnchilada[0].sectionCurrentDataResult[i].sectionHistory =  inputHistorySvc.historyInputs(bigEnchilada);
        }
      $scope.sections = bigEnchilada[0].sectionCurrentDataResult;

    });

is this what you're looking for?

var app = angular.module('angularjs-starter', []);

app.controller('MainCtrl', function($scope,bigEnchilada,inputHistorySvc) {
var list = inputHistorySvc.historyInputs(bigEnchilada);
for (var i = 0; i < bigEnchilada[0].sectionCurrentDataResult.length; i++){
   for (var j = 0; j < list.length; j++ ) {
      if(bigEnchilada[0].sectionCurrentDataResult[i].section_id ==      list[j].section_id){
          bigEnchilada[0].sectionCurrentDataResult[i].sectionHistory = list[j];
      }
   }
}
  $scope.sections = bigEnchilada[0].sectionCurrentDataResult;

});

Output:

[
{
"section_id": 14785,
"subdivision_name": "Stratton Woods",
"sectionHistory": {
  "section_id": 14785,
  "price_min": 190,
  "price_max": 220
}
},
{
"section_id": 14790,
"subdivision_name": "Stratton Woods",
"sectionHistory": {
  "section_id": 14790,
  "price_min": 150,
  "price_max": 269
}
},
 {
"section_id": 14791,
"subdivision_name": "Stratton Woods",
"sectionHistory": {
  "section_id": 14791,
  "price_min": 145,
  "price_max": 221
}
},

etc.

var inputHistory = inputHistorySvc.historyInputs(bigEnchilada);
  for (var i = 0; i < bigEnchilada[0].sectionCurrentDataResult.length; i = i + 1) {
      for (x = 0; x < inputHistory.length; x = x + 1) {
        if (bigEnchilada[0].sectionCurrentDataResult[i].section_id === inputHistory[x].section_id) {
          bigEnchilada[0].sectionCurrentDataResult[i].sectionHistory = inputHistory[x];
        }
      }
      }
  $scope.sections = bigEnchilada[0].sectionCurrentDataResult;

You can use a temporary object and two separated loops. One for getting all references and the second to assign the data to the reference. Big O in this solution: O(n) .

 var data = [{ "sectionCurrentDataResult": [{ "section_id": 14785, "subdivision_name": "Stratton Woods", }, { "section_id": 14790, "subdivision_name": "Stratton Woods", }, { "section_id": 14791, "subdivision_name": "Stratton Woods" }, { "section_id": 14792, "subdivision_name": "Stratton Woods" }, { "section_id": 14781, "subdivision_name": "Stratton Woods" }, { "section_id": 14786, "subdivision_name": "Stratton Woods" }, { "section_id": 14787, "subdivision_name": "Stratton Woods" }, { "section_id": 14788, "subdivision_name": "Stratton Woods" }, { "section_id": 14782, "subdivision_name": "Stratton Woods" }, { "section_id": 14783, "subdivision_name": "Stratton Woods" }, { "section_id": 14784, "subdivision_name": "Stratton Woods" }, { "section_id": 5326, "subdivision_id": 1439, "subdivision_name": "Stratton Woods" }] }, { "sectionPastDataResult": [{ "section_id": 5326, "price_min": 177, "price_max": 235 }, { "section_id": 14785, "price_min": 190, "price_max": 220 }, { "section_id": 14786, "price_min": 238, "price_max": 292 }, { "section_id": 14788, "price_min": 186, "price_max": 205 }, { "section_id": 14790, "price_min": 150, "price_max": 269 }, { "section_id": 14783, "price_min": 150, "price_max": 260 }, { "section_id": 14787, "price_min": 90, "price_max": 90 }, { "section_id": 14792, "price_min": 177, "price_max": 235 }, { "section_id": 14791, "price_min": 145, "price_max": 221 }, { "section_id": 14784, "price_min": 148, "price_max": 186 }, { "section_id": 14781, "price_min": 155, "price_max": 200 }, { "section_id": 14782, "price_min": 150, "price_max": 170 }] }]; void function () { var o = {}; data[0].sectionCurrentDataResult.forEach(function (a) { o[a.section_id] = a; }); data[1].sectionPastDataResult.forEach(function (a) { o[a.section_id].sectionHistory = [a]; }); }(); document.write('<pre>' + JSON.stringify(data, 0, 4) + '</pre>'); 

You can actually avoid the nested looping if you break this json , sort them by section_id and then just create the required object in a single loop. You can also avoid the if -else loop and equality check

     // Get sorted array of  sectionCurrentDataResult
var array1 = a[0]["sectionCurrentDataResult"].sort(function(x,y){
     return x.section_id>y.section_id? 1 : x.section_id<y.section_id? -1 :0; 
  })

 // Get sorted array of  sectionPastDataResult

var array2= a[1]["sectionPastDataResult"].sort(function(x,y){
     return x.section_id>y.section_id? 1 : x.section_id<y.section_id? -1 :0; 
  })

// Will be populated with merged data
var sectionCurrentDataResult=[]

  for(var a = 0;a<array1.length;a++){
      var sectionHistory=[];
      sectionHistory.push({
      "section_id":array2[a].section_id,
      "price_min":array2[a].price_min,
      "price_max":array2[a].price_max
      })
      sectionCurrentDataResult.push({
      "section_id":array1[a].section_id,
      "subdivision_name":array1[a].subdivision_name,
      "sectionHistory":sectionHistory
      })
  }
  console.log(sectionCurrentDataResult);

WORKING EXAMPLE

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM