JavaScript

时间:2018-07-25 05:41:14

标签: javascript arrays object

我有一个对象数组:

    let arr = [{start: 1, end: 5, group: [1, 3, 5]},
    {start: 12, end: 17, group: [6, 20,]}]

我需要将此数组转换为:

    let arr_transformed = [{start: 1, end: 5, group: 1},
    {start: 1, end: 5, group: 3},
    {start: 1, end: 5, group: 5},
    {start: 12, end: 17, group: 6},
    {start: 12, end: 17, group: 20}
    ]

基本上,我需要复制具有组对象中元素数量的对象值(开始,结束),并将单个组号放入其中。

6 个答案:

答案 0 :(得分:2)

我知道已经有很多答案了。即使我以另一种简单的方式提供答案,但不是最好的。

transformObject =(data)=>{
let cnt=0;
  let finalArray=[];

  for(let i=0;i <data.length;i++){
    let grouplen =data[i].group;
    for (let j = 0; j < grouplen.length; j++) {
      finalArray[cnt]={
        start: data[i].start,
        end: data[i].end,
        group: grouplen[j]
      }
      cnt++;
    }
  }
  return finalArray;
}
  let data = [{start: 1, end: 5, group: [1, 3, 5]},
  {start: 12, end: 17, group: [6, 20,]}];
  const result = transformObject(data);
  console.log("transformed Object:",result);

答案 1 :(得分:0)

您可以将Array#reduceArray#forEach结合使用。

这个想法是循环遍历源数组,然后在每次迭代中循环遍历group键。在每个内部迭代中,将组成的对象推到最终结果。

let arr = [{start:1,end:5,group:[1,3,5]},{start:12,end:17,group:[6,20]}];

const transformed = arr.reduce((res, { start, end, group }) => {
  group.forEach(g => res.push({ start, end, group: g }));
  return res;
}, []);

console.log(transformed);

答案 2 :(得分:0)

基本伪代码算法:

result = []
for object in arr {
    for group in object.group {
        result.push({object.start, object.end, group})
    }
}
return result

在外部循环中遍历数组,并在内部循环中遍历各组,将展平的对象推入结果数组对象。

答案 3 :(得分:0)

let arr = [{start: 1, end: 5, group: [1, 3, 5]},
{start: 12, end: 17, group: [6, 20,]}]
var arr_transformed = [];
for(var i = 0; i < arr.length; i++) {
  var help = arr[i]['group'];
  delete arr[i]['group'];
  for(var j = 0; j < help.length; j++) {
    arr[i].group = help[j];
    arr_transformed.push(arr[i]);
  }
}
console.log(arr_transformed);

运行此代码,然后输出

答案 4 :(得分:0)

使用forEach和地图

let results = [];

arr.forEach( i => {
  results = results.concat(i.group.map(group => {
    return {
      start: i.start,
      end: i.end,
      group
    };
  }))
});

答案 5 :(得分:0)

很多方法……

这里有一个单行代码,可以减少每个元素并将组映射到累加器数组中:

let arr = [{start: 1, end: 5, group: [1, 3, 5]},{start: 12, end: 17, group: [6, 20,]}]

let r = arr.reduce((a, {start, end, group}) => a.concat(group.map(group => ({start, end, group}))), [])
console.log(r)