如何将数组oArr
转换为如下示例所示的结果
示例:
输入:
let oArr = [
{
'1': Object,
'range': [0, 778]
}, {
'2': Object,
'range': [0, 778]
}, {
'1': Object,
'range': [779, 1500]
}, {
'3': Objcet,
'range': [779, 1500]
}
]
输出:
result = [
{
'range': [0, 778],
'1': Object,
'2': Object
}, {
'range': [779, 1500],
'1': Object,
'3': Object
}
]
在数组的每个元素上使用reducer
函数可以将它们按范围值分组,并通过迭代除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);
注意:此解决方案假定以下条件:
源数组中每个范围的对象不超过一个。
范围数组始终始终只有2个值,它们的顺序相同(例如range: [0,100]
和range: [100,0]
会被认为是不同的。