如何将数据转换为这种结构

问题描述 投票:0回答:1

如何将数组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
    }
]
javascript arrays object data-structures data-conversion
1个回答
0
投票

在数组的每个元素上使用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);
  

0
投票

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

注意:此解决方案假定以下条件:

  1. 源数组中每个范围的对象不超过一个。

  2. 范围数组始终始终只有2个值,它们的顺序相同(例如range: [0,100]range: [100,0]会被认为是不同的。

© www.soinside.com 2019 - 2024. All rights reserved.