Egidi
Egidi

Reputation: 1776

javascript processing an array of objects to obtain a new array of objects

I need to obtain from a given array of objects another array of objects but a little bit processed. Example:

 var arr =   [
      {
        "level": "INF",
        "model": "A"
      },{
        "level": "INF",
        "model": "B"
      },{
        "level": "INF",
        "model": "C"
      },{
        "level": "INC",
        "model": "A"
      },{
        "level": "IND",
        "model": "A"
      },{
        "level": "IND",
        "model": "B"
      }
]

process_array(arr)

should return:

      [{
        "level": "INF",
        "model": "A-B-C"
      },{
        "level": "INC",
        "model": "A"
      },{
        "level": "IND",
        "model": "A-D"
      }]

I mean, there only will be one object per different level and all the different models for that level will be concatenated by '-'.

What would be an easy way to achieve so?

My approach, for getting an array with different levels:

function process_array(array) {
    var values_seen = {}; // for removing duplicates
    for (var i = 0; i < array.length; i++) {
        values_seen[array[i]["level"]] = true;
    }
    return Object.keys(values_seen);
}

Now i need to obtain the concatented models for each levels..

Upvotes: 4

Views: 1189

Answers (4)

Ja͢ck
Ja͢ck

Reputation: 173522

Just reduce the array into an object:

return array.reduce(function(total, current) {
  if (total[current.level]) { // existing
    total[current.level].model += '-' + current.model;
  } else { // new
    total[current.level] = current;
  }
  return total;
}, {});

Demo

In each iteration you modify the total object and then return it to be used within the next iteration. The final value of that object is returned to the caller.

See also Array.prototype.reduce()

Upvotes: 4

gion_13
gion_13

Reputation: 41533

function processArray(arr) {
    var result = [];
    arr
        .map(function(v) {return v.level;})
        .forEach(function(v, i) {
            var resultValue = result.filter(function(el, j) {
                return el.level === v;
            })[0];

            if(!resultValue) {
              result.push(arr[i]); 
            } else {
              resultValue.model += '-' + arr[i].model;
            }
        });
    return result;
}

var arr = [
      {
        "level": "INF",
        "model": "A"
      },{
        "level": "INF",
        "model": "B"
      },{
        "level": "INF",
        "model": "C"
      },{
        "level": "INC",
        "model": "A"
      },{
        "level": "IND",
        "model": "A"
      },{
        "level": "IND",
        "model": "B"
      }
];

alert(JSON.stringify(processArray(arr), null, 2));

Upvotes: 0

Jeff
Jeff

Reputation: 12163

What you are referring to is also called projection.

This code uses EcmaScript 5.

var arr =   [
      {
        "level": "INF",
        "model": "A"
      },{
        "level": "INF",
        "model": "B"
      },{
        "level": "INF",
        "model": "C"
      },{
        "level": "INC",
        "model": "A"
      },{
        "level": "IND",
        "model": "A"
      },{
        "level": "IND",
        "model": "B"
      }
];

function processArray(input) {
    var buf = {}, result = [];
    input.forEach(function(item) {
        var model = item.model;
        var existing = buf[item.level];
        if (existing) {
           existing.model += '-' + item.model;         
        } else {
            existing = buf[item.level] = {
                level: item.level,
                model: model
            };
            result.push(existing);
        }
    });
    return result;
}

var processed = processArray(arr);
console.log(processed);

Upvotes: 0

Vigneswaran Marimuthu
Vigneswaran Marimuthu

Reputation: 2532

var arr =   [
      {
        "level": "INF",
        "model": "A"
      },{
        "level": "INF",
        "model": "B"
      },{
        "level": "INF",
        "model": "C"
      },{
        "level": "INC",
        "model": "A"
      },{
        "level": "IND",
        "model": "A"
      },{
        "level": "IND",
        "model": "B"
      }
]

function processArray(array) {
    
    var count = array.length, i, item, result = [], temp = {};
    
    for (i = 0; i < count; i++) {
        item = array[i];
      
        if (temp[item.level] !== undefined) {
            result[temp[item.level]].model += '-' + item.model;        
        } else {
            temp[item.level] = result.length;
            result.push(item);
        }
        
    }

    return result;
}

alert(JSON.stringify(processArray(arr)));

Upvotes: 2

Related Questions