2017-04-16 64 views
0

让我们加入多个对象说我有对象的一个​​这样的数组:通过钥匙在JavaScript

data = [ 
    { 
     set: "a", 
     values: [ 
      {time: 1, value: 10}, 
      {time: 2, value: 13}, 
      {time: 3, value: 12} 
     ] 
    }, 
    { 
     set: "b", 
     values: [ 
      {time: 1, value: 22}, 
      {time: 2, value: 24}, 
      {time: 3, value: 27} 
     ] 
    }, 
    { 
     set: "c", 
     values: [ 
      {time: 1, value: 34}, 
      {time: 2, value: 38}, 
      {time: 3, value: 18} 
     ] 
    }, 
    { 
     set: "d", 
     values: [ 
      {time: 1, value: 24}, 
      {time: 2, value: 19}, 
      {time: 3, value: 22} 
     ] 
    } 
] 

,我想通过一次参加对象是这样的:

data = [ 
    {time: 1, set_a: 10, set_b: 22, set_c: 34, set_d: 24}, 
    {time: 2, set_a: 13, set_b: 24, set_c: 38, set_d: 19}, 
    {time: 3, set_a: 12, set_b: 27, set_c: 18, set_d: 22} 
] 

在途中我可以这样做,将putta独特的时间键,然后循环通过每个集合,并创建一个新的对象与thsoe值。但这是做这件事最有效的方法吗?还是有一个功能可以做一些类似的事情?

+1

你应该先尝试......然后询问何时遇到问题。这不是*“如何”*教程网站或免费代码编写服务。这里的目标是在你的代码**没有按预期执行时帮助你。这听起来像你有一个很好的想法如何开始......并跳过枪问我们 – charlietfl

+1

@charlietfl我不同意 - OP提供了一个抽象的方法,并询问是否有更有效的方法来解决所述问题。代码并不总是必需的。 –

+1

@le_m不同意所有你想要的,但是OP的规范至少要显示[help] – charlietfl

回答

0

您可以使用类似map reduce之类的东西。

例子:

// data = { ... } 

var result = data.map(function (item) { 
    var tmp = {}; 
    for (var i in item.values) { 
    tmp[item.values[i].time] = { ['set_' + item.set]: item.values[i].value }; 
    } 
    return tmp; 
}).reduce(function (a, b) { 
    for (i in a) { 
    Object.assign(a[i], b[i]) 
    } 
    return a; 
}); 

该方法的效率已经在这里讨论:

For Array, is it more efficient to use map() & reduce() instead of forEach() in javascript?

0

这是一个穿越问题,以输出你的结果,你必须在每个项目遍历。但是,这些集合是相互独立的,一个不能从之前的计算中推导出后一个集合的值。无需遍历树就可以优化解决方案 。下面是一个简单的O(m * n个)时间的解决方案,其中m的次数,n是数台(A,B,C ...)

const data = [ 
 
    { 
 
     set: "a", 
 
     values: [ 
 
      {time: 1, value: 10}, 
 
      {time: 2, value: 13}, 
 
      {time: 3, value: 12} 
 
     ] 
 
    }, 
 
    { 
 
     set: "b", 
 
     values: [ 
 
      {time: 1, value: 22}, 
 
      {time: 2, value: 24}, 
 
      {time: 3, value: 27} 
 
     ] 
 
    }, 
 
    { 
 
     set: "c", 
 
     values: [ 
 
      {time: 1, value: 34}, 
 
      {time: 2, value: 38}, 
 
      {time: 3, value: 18} 
 
     ] 
 
    }, 
 
    { 
 
     set: "d", 
 
     values: [ 
 
      {time: 1, value: 24}, 
 
      {time: 2, value: 19}, 
 
      {time: 3, value: 22} 
 
     ] 
 
    } 
 
]; 
 

 
function processData(data) { 
 
    if (data.length === 0 || data[0].values.length === 0) 
 
    return []; 
 
    const result = []; 
 
    const times = data[0].values.length; 
 
    for(var i = 0; i < times; i++) { 
 
    const item = {}; 
 
    item.time = data[0].values[i].time; 
 
    data.forEach(x => item["set_" + x.set] = x.values[i].value); 
 
    result.push(item); 
 
    } 
 
    return result; 
 
} 
 

 
console.log(processData(data));