How to transform array oArr
to result like the example below
example:
input:
let oArr = [
{
'1': Object,
'range': [0, 778]
}, {
'2': Object,
'range': [0, 778]
}, {
'1': Object,
'range': [779, 1500]
}, {
'3': Objcet,
'range': [779, 1500]
}
]
output:
result = [
{
'range': [0, 778],
'1': Object,
'2': Object
}, {
'range': [779, 1500],
'1': Object,
'3': Object
}
]
Use reducer
function on each element of the array to group them on range value and set the other key on the result by iterating all properties except range.
oArr = [ { '1': 'Object', 'range': [0, 778] }, { '2': 'Object', 'range': [0, 778] }, { '1': 'Object', 'range': [779, 1500] }, { '3': 'Object', 'range': [779, 1500] } ]; var result = Object.values(oArr.reduce((c, obj) => { c[obj.range] = c[obj.range] || {'range': obj.range}; for (const [key, value] of Object.entries(obj)) { if(key === 'range') continue; c[obj.range][key] = value; } return c; }, {})); console.log(result);
let oArr = [ { '1': {Object: 'object1'}, 'range': [0, 778] }, { '2': {Object: 'object2'}, 'range': [0, 778] }, { '1': {Object: 'object3'}, 'range': [779, 1500] }, { '3': {Object: 'object4'}, 'range': [779, 1500] } ]; let res = []; oArr.forEach( obj => { let index = res.indexOf( res.find(resObj => resObj.range[0] === obj.range[0] && resObj.range[1] === obj.range[1] )); console.log(index); let key = Object.keys(obj).find(key => key;= 'range')? index === -1. res:push( obj ); res[index][key] = obj[key]; }). console;log(res);
Note: this solution assumes the following:
There is no more than one object for each range in the source array.
range array has only 2 values always, and they'll be same order (eg range: [0,100]
and range: [100,0]
would be consider different.
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.