2017-04-16 66 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));