Reputation: 1807
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
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
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