简体   繁体   中英

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?

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"));

 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 -->

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