2017-06-21 1 views
1

私はこのコードフラグメントでes6構文を使用しようとしています。Array.reduceのスプレッドノーテーションを使用

let checkList = [1, 2].map(i => "Check " + i) 

let checks = checkList 
    // .reduce((acc, check) => Object.assign(acc, {[check]: {valid: false}}), {}) 
    .reduce((acc, check) => {...acc, {[check]: {valid: false}}}, {}) 
console.log(checks) 

出力私はhttps://babeljs.ioにコメント行を使用する場合は以下の通りであると私は新しい構文を使用して取得したいものです。

Object { 
    "Check 1": Object { 
    "valid": false 
    }, 
    "Check 2": Object { 
    "valid": false 
    } 
} 

このコードに構文エラーがあるかどうかはわかりません。私はbabeljsのすべてのプリセットを選択しようとしましたが、正しくコンパイルしません。

+0

それはES6構文ではありません。オブジェクトリテラルでスプレッドシンタックスを使用することはできません。実験的に提案された構文です。 – Bergi

+0

オブジェクトを返す[ECMAScript6 arrow関数]の重複の可能性あり(https://stackoverflow.com/questions/28770415/ecmascript6-arrow-function-that-returns-an-object) – Bergi

答えて

2

オブジェクトの広がりはstage 3 proposalであり、既存の仕様の一部ではありません。 BabelではStage 3 presetを有効にする必要があります。つまり、transform-object-rest-spreadです。

上記のコードには、必要なプリセットでも正しくコンパイルできないという構文エラーがあります。

それのshould be

let checks = checkList 
    .reduce((acc, check) => ({...acc, [check]: {valid: false}}), {}); 
2

まずあなたは(あなたはまた、その上のスプレッド演算子を使用する場合を除き)、余分なオブジェクトのプロパティをラップしていません。

ので{...acc, {[check]: {valid: false}}}これは、あなたがアキュムレータにオブジェクトを追加している意味{...acc, [check]: {valid: false}}

になることができます。このオブジェクトのキーは、割り当てた名前(Check[n])で、値は設定したものです({valid ...})。

第2に、私が知っている限り、明示的に新しい値を指定しなくてもスプレッド演算子を使用することはできません。だから、のような新しい行にあなたの状態を記述する必要があり、次のいずれか

let checks = checkList.reduce((acc, check) => { 
    return {...acc, [check]: {valid: false}} 
}, {}) 

や余分な括弧でラップ:

let checks = checkList.reduce((acc, check) => ({...acc, [check]: {valid: false}}) , {}) 
+0

返信いただきありがとうございます。エラーを特定するのに間違いなく助けになりました。 –

関連する問題