2017-12-14 10 views
2

共通のプロパティ名を共有するオブジェクトの配列がありますが、値は異なります。例えば、彼らはこのように行く:私のデータセット内の各オブジェクトが含まれてなるようにオブジェクトのキーと値を反復して新しいオブジェクトを返す

let datasets = [ 
    { 
     label: "value1", 
     data: ["11:00", "12:00", "13:00"] 
    }, 
    { 
     label: "value2", 
     data: [0.737462,0.894368,1.140516,] 
    } 
    // and so on 
] 

:これらのオブジェクトから

let data = [ 
    { 
     value1: "11:00", 
     value2: 0.737462, 
     value3: 1.345341, 
     value4: 0.684655 
    }, 
    { 
     value1: "12:00", 
     value2: 0.894368, 
     value3: 1.55891, 
     value4: 0.784655 
    }, 
    { 
     value1: "13:00", 
     value2: 1.140516, 
     value3: 1.938695, 
     value4: 0.454655 
    } 
] 

、私は次のようにオブジェクトの新しい配列を形成する必要があります元のオブジェクトのプロパティ名は、labelの値であり、その名前に対応するプロパティの配列です。私はこのようにそれを行うにしようとしました:

let datasets = data.map((n) => { 
    for (i in n) { 
     return { 
      label: i, 
      data: data.map(obj => obj[i]) 
     } 
    } 
}); 

しかし、期待どおりに動作しません - それはそれらすべての全体のラベルとしてのみ最初のプロパティ名とオブジェクトの配列だけを返します。私はそれがfor...inループの最初の項目に入るとすぐに戻りますが、私は必要なものを達成するためのよりよい方法を見つけ出すことができないからです。

答えて

2

予想される配列内の要素の数はそれほどデータ配列を生成する別の単純なマップを実行し、その上にマップする配列要素のキーの数に等しいです。フィドルhere作業

var out = Object.keys(data[0]).map(function(key) { 
    return { 
    label: key, 
    data: data.map(function(obj) { 
     return obj[key]; 
    }) 
    }; 
} 
2

reduce()とES6 Mapでこれを行うことができます。

let data = [{"value1":"11:00","value2":0.737462,"value3":1.345341,"value4":0.684655},{"value1":"12:00","value2":0.894368,"value3":1.55891,"value4":0.784655},{"value1":"13:00","value2":1.140516,"value3":1.938695,"value4":0.454655}] 
 

 
var result = [...data.reduce(function(r, e) { 
 
    return Object.keys(e).forEach(k => { 
 
    if(!r.has(k)) r.set(k, {label: k, data: [e[k]]}) 
 
    else r.get(k).data.push(e[k]) 
 
    }), r 
 
}, new Map).values()] 
 

 
console.log(result)

+0

注:このような場合に動作します。https://jsfiddle.net/Lg0wyt9u/2593/ –

0
const datasets = data.reduce((acc, a) => { 
    return acc.map(set => Object.assign({}, set, { data: set.data.concat(a[set.label])})); 
}, Object.keys(data[0]).map(k => ({label: k, data: []}))); 

関連する問題