HiDayurie Dave
HiDayurie Dave

Reputation: 1807

jquery/javascript merge array with same id

I have these below array result:

[
{"timeNameID":"2","alarmID":"1"},
{"timeNameID":"3","alarmID":"2"},
{"timeNameID":"4","alarmID":"3"},
{"timeNameID":"5","alarmID":"1"},
{"timeNameID":"6","alarmID":"2"},
{"timeNameID":"7","alarmID":"2"},

{"timeNameID":"2","alarmID":"2"},
{"timeNameID":"4","alarmID":"1"},
{"timeNameID":"5","alarmID":"1"},
{"timeNameID":"6","alarmID":"2"},
{"timeNameID":"7","alarmID":"4"}
]

from this JS script:

var post_str = []
$('.alarm1, .alarm2').each(function ()
{
    var timeNameID = $(this).attr('id'),
        alarmID = $(this).find(':selected').val()
                    
        post_str.push({
            'timeNameID': timeNameID,
            'alarmID': alarmID
        });
});
                
alert(JSON.stringify(post_str));

Now I need to merge that array with same timeNameID, to be like this:

[
{"timeNameID":"2","alarmID":"1","alarmID2":"2"},
{"timeNameID":"3","alarmID":"2","alarmID2":""}, //null/empty
{"timeNameID":"4","alarmID":"3","alarmID2":"1"},
{"timeNameID":"5","alarmID":"1","alarmID2":"1"},
{"timeNameID":"6","alarmID":"2","alarmID2":"2"},
{"timeNameID":"7","alarmID":"2","alarmID2":"4"}
]

Is it possible to do that array merge to be like my above expected?

Upvotes: 2

Views: 220

Answers (2)

sonali
sonali

Reputation: 758

    let data = [
    {"timeNameID":"2","alarmID":"1"},
    {"timeNameID":"3","alarmID":"2"},
    {"timeNameID":"4","alarmID":"3"},
    {"timeNameID":"5","alarmID":"1"},
    {"timeNameID":"6","alarmID":"2"},
    {"timeNameID":"7","alarmID":"2"},

    {"timeNameID":"2","alarmID":"2"},
    {"timeNameID":"4","alarmID":"1"},
    {"timeNameID":"5","alarmID":"1"},
    {"timeNameID":"6","alarmID":"2"},
    {"timeNameID":"7","alarmID":"4"}
    ]

    let hash = {};
    let result = [];
    data.forEach(item=>{
      if(hash[item.timeNameID]) {
        hash[item.timeNameID].push(item.alarmID) 
      } else {
         hash[item.timeNameID] = [item.alarmID]
      }
    })


    Object.entries(hash).forEach(entry => {
      const [key, val] = entry;
      result.push({"timeNameID": key, "alarmID": val[0]?val[0]:'', "alarmID2": val[1]?val[1]:''})
    });

    console.log(result)

You can solve this using hash maps

<!-- begin snippet: js hide: false console: true babel: false -->

Upvotes: 2

Other Me
Other Me

Reputation: 508

Tada

const obj1 = {
  id: 1,
  name: "bill"
};

const obj2 = {
  id: 1,
  name: "joe"
};

const data = [
{"timeNameID":"2","alarmID":"1"},
{"timeNameID":"3","alarmID":"2"},
{"timeNameID":"4","alarmID":"3"},
{"timeNameID":"5","alarmID":"1"},
{"timeNameID":"6","alarmID":"2"},
{"timeNameID":"7","alarmID":"2"},

{"timeNameID":"2","alarmID":"2"},
{"timeNameID":"4","alarmID":"1"},
{"timeNameID":"5","alarmID":"1"},
{"timeNameID":"6","alarmID":"2"},
{"timeNameID":"7","alarmID":"4"}
];

function merge(obj1, obj2) {
  const keys = Object.keys(obj1);
  for(const key of Object.keys(obj2)) {
    if(!keys.includes(key)) keys.push(key);
  }
  const result = {};
  for(const key of keys) {
    result[key] = obj1[key]===obj2[key]?obj1[key]:[obj1[key], obj2[key]];
  }
  return result;
}
function mergeTwin(data1, key) {
  const store = {};
  for(const [ia, ea] of Object.entries(data1)) {
    store[ea[key]] = store[ea[key]]===undefined?ea:merge(store[ea[key]], ea);
  }
  const data = [];
  for(const [id, element] of Object.entries(store)) {
    data.push(element);
  }
  return data;
}

console.log(mergeTwin(data, "timeNameID"));

Upvotes: 3

Related Questions