どう

2016-10-03 2 views
0

私はこのような何かを持って異なる特性を持つ2つのオブジェクトをマージします。したがって、次のようなものがあります。どう

let wantedResult = { 
    companyName: "Name", 
    address: "company address", 
    name: "User", 
    mobile: 0123, 
    files: [ 
      {file: "companyLogo", values: {active: false, fileName: "some name"}}, 
      {file: "avatar", values: {active: false, fileName: "file name"}} 
     ] 
}; 

どうすればいいですか?

+0

ループそれらを通して、あなたwantedresultに割り当てますか?あなたが試したことを教えてください。 – Bergi

+1

手順3は矛盾しています。それは 'values:{ファイル:[{...}、{...}}}'でしょうか? – iblamefish

答えて

1

これを試すことができます!

let user = [{ 
 
    name: "step-one", 
 
    values: { 
 
    companyName: "Name", 
 
    address: "company address" 
 
    } 
 
}, { 
 
    name: "step-two", 
 
    values: { 
 
    name: "User", 
 
    mobile:
 
    } 
 
}, { 
 
    name: "step-three", 
 
    values: [{ 
 
    file: "companyLogo", 
 
    values: { 
 
     active: true, 
 
     fileName: "some name" 
 
    } 
 
    }, { 
 
    file: "avatar", 
 
    values: { 
 
     active: true, 
 
     fileName: "file name" 
 
    } 
 
    }] 
 
}] 
 

 
var wantedResult = Object.assign({}, user[0].values, user[1].values, {files: user[2].values}) 
 
console.log(wantedResult)

0

これは、理由はファイルアレイのビットハックですが、私はそのようにそれを行うだろう:もちろん

var wantedResult = user.reduce((result, step) => { 
    var values = Array.isArray(step.values) ? { files: step.values } : step.values; 
    return Object.assign({}, result, values) 
}, {}); 

それだけのようなもののために働くだろうあなたが提供した構造。 'values'プロパティに配列を持つオブジェクトがさらにある場合は、そのアプローチを再考する必要があります。

+0

そして上記のコメントで述べたように、 'step-three'の構造を一貫して変更し、配列の代わりに 'values'プロパティにオブジェクトを持つと、はるかに意味があります。その場合、私のコードからvar値の割り当てを削除し、step.valuesで割り当てられたオブジェクトを使用することができます。 –

0

手順3は他と矛盾しています。可能であれば、一致するようにしてください:values: files: [ { file1_data }, { file2_data } ]

不一致を修正した後、各ステップを繰り返して、新しいプロパティを結果に追加できます。

let wantedResult = user.reduce(function(result, spec) { 
    Object.keys(spec.values).forEach(function(key) { 
    result[key] = spec.values[key]; 
    }); 
    return result; 
}, {}); 

ステップ3を変更することができない場合、あなたはそれが少し少ないクリーンにすることができます。

let wantedResult = user.reduce(function(result, spec) { 
    if (spec.name === "step-three") { 
    result.files = spec.values; 
    } 
    else { 
    Object.keys(spec.values).forEach(function(key) { 
     result[key] = spec.values[key]; 
    }); 
    } 
    return result; 
}, {});