-1

I have an array of objects below

var inventory = [
    { Name: "KIT001", SerialNo: "K111", Status: "Out For Cleaning", NewStatus: "Cleaned" },
    { Name: "KIT001", SerialNo: "K112", Status: "Out For Cleaning", NewStatus: "Cleaned" },
    { Name: "KIT001", SerialNo: "K113", Status: "Out For Cleaning", NewStatus: "Cleaned" },
    { Name: "KIT001", SerialNo: "K132", Status: "Out For Cleaning", NewStatus: "Need Cleaning" },
    { Name: "KIT001", SerialNo: "K134", Status: "Out For Cleaning", NewStatus: "Need Cleaning" },
];

I would like to do a group by "Out For Cleaning" and "Cleaned" in such a way that the end result would return multiple arrays like below:

var arr1 = [
    { Name: "KIT001", SerialNo: "K111", Status: "Out For Cleaning", NewStatus: "Cleaned" },
    { Name: "KIT001", SerialNo: "K112", Status: "Out For Cleaning", NewStatus: "Cleaned" },
    { Name: "KIT001", SerialNo: "K113", Status: "Out For Cleaning", NewStatus: "Cleaned" },
];

var arr2 = [
    { Name: "KIT001", SerialNo: "K132", Status: "Out For Cleaning", NewStatus: "Need Cleaning" },
    { Name: "KIT001", SerialNo: "K134", Status: "Out For Cleaning", NewStatus: "Need Cleaning" },
];

UPDATE

I need to do a group by STATUS first and then NEW_STATUS. Note, that these arrays will be dynamic.

var STATUS = ["Out For Cleaning", "Out For Repair"];
var NEW_STATUS = ["Cleaned", "Repaired"];

This is what I came up with however, it only groups by the STATUS property.

for (var i = 0; i < STATUS.length; i++) {
          var arr1 = inventory.filter(function (el) {
               return el.Status == STATUS[i];
          });

          if(arr1.length > 0)
               console.log('Final Array: ', arr1)              
}
mihai6744
  • 164
  • 7

3 Answers3

2

One way would be to filter the array:

var arr1 = status.filter(function(el) {
    return el.NewStatus == "Cleaned";
});

var arr2 = status.filter(function(el) {
    return el.NewStatus == "Need Cleaning";
});
bgse
  • 8,237
  • 2
  • 37
  • 39
0

This is what I would do:

function GroupBy(array){
  var fields = Array.prototype.slice.call(arguments, 1);
  var field = fields.shift();

  if(field){

    var groupedArray = [];
    for(var i in array){
      var index = array[i][field];
      groupedArray[index] = groupedArray[index] || [];
      groupedArray[index].push(array[i]);
    }

    for(var i in groupedArray)
      groupedArray[i] = GroupBy.bind(null, groupedArray[i]).apply(null, fields);

    return groupedArray;
  }

  return array;
}

Then use it like this. Group the records by fields:

var groupedArray = GroupBy(yourArray, "STATUS", "NEW_STATUS");

Then get records by the specified fields:

var list = groupedArray["Out For Cleaning"]["Need Cleaning"];
0
for (var i = 0; i < STATUS.length; i++) {

  var arr1 = inventory.filter(function(el) {
      return el.NewStatus == NEW_STATUS[i-1];
      console.log(el.NewStatus);
  });

  document.getElementById("grey").innerHTML =JSON.stringify(arr1);

  var arr2 = inventory.filter(function(el) {
      return el.NewStatus == NEW_STATUS[i];
  });

  document.getElementById("blue").innerHTML =JSON.stringify(arr2);

}
Datacrawler
  • 2,780
  • 8
  • 46
  • 100