0

APIから返されたデータの一部を正規化しようとしています。既にプロジェクト内でアンダースコアを使用しています。オブジェクトとキーの配列をIDで正規化

var res = [{ 
    badge_no: 123, 
    id: 1, 
    name: 'bob' 
    }, { 
    badge_no: 456, 
    id: 2, 
    name: 'bill' 
    }, { 
    badge_no: 789, 
    id: 3, 
    name: 'ben' 
    }, 
    // etc 
]; 

私は次のようになり、データ構造を作成するために探しています:私がobj内のIDを維持することが重要である

var normalisedRes = [{ 
    1: { 
    badge_no: 123, 
    id: 1, 
    name: 'bob' 
    } 
}, { 
    2: { 
    badge_no: 456, 
    id: 2, 
    name: 'bill' 
    } 
}, { 
    3: { 
    badge_no: 789, 
    id: 3, 
    name: 'ben' 
    } 
}]; 

を。私はreduceでこれを達成できると信じていますが、私は苦労しています。

ありがとうございました!

EDIT:この質問に答えました。ここでのアドバイスの一部から

、私は次のようになりOBJを返すために、データを正規化することを決定した:

{ '1': {data}, '2':{data}, '3':{data} } 

これを行うには、私はもともと私がすべきと思って、私は、削減使用:

もう一度お返事いただきありがとうございます。あなたはまた、仕事を得る必要があるが、reduce()map()を使用することができますしたい場合は

+1

これまでに試したコードを共有できますか? – Rajesh

+4

オブジェクトの配列が必要です。オブジェクトのそれぞれには、単一のキー(その 'id')が含まれていますか?それはあなたが始めたものの「より良い」または正規化されたバージョンとはどのようなものでしょうか?なぜあなたはその構造を望んでいますか? –

+3

最終的な構造は意味をなさない。 1つのオブジェクトをラップするために配列が必要なのはなぜですか? – charlietfl

答えて

1

あなたはArray#map()

var res = [{badge_no:123, id:1, name:'bob'},{badge_no:456, id:2, name:'bill'},{badge_no:789, id:3, name:'ben'}]; 
 

 
var result = res.map(e => ({[e.id]: e})) 
 
console.log(result)

でこれを行うことができます。

var res = [{badge_no:123, id:1, name:'bob'},{badge_no:456, id:2, name:'bill'},{badge_no:789, id:3, name:'ben'}]; 
 

 
var result = res.reduce((r, e) => (r.push({[e.id]: e}), r), []) 
 
console.log(result)

+0

正解ですが、OPが努力を分かち合うのを待っていないといけませんか? – Rajesh

1

あなたは、オブジェクトにArray#mapを使用してidでキーを設定し、オブジェクトを返すことができます。 ES6で

var array = [{ badge_no: 123, id: 1, name: 'bob' }, { badge_no: 456, id: 2, name: 'bill' }, { badge_no: 789, id: 3, name: 'ben' }], 
 
    result = array.map(function (a) { 
 
     var o = {}; 
 
     o[a.id] = a; 
 
     return o; 
 
    }); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

、あなたは計算されたプロパティを使用することができます。

var array = [{ badge_no: 123, id: 1, name: 'bob' }, { badge_no: 456, id: 2, name: 'bill' }, { badge_no: 789, id: 3, name: 'ben' }], 
 
    result = array.map(a => ({ [a.id]: a })); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+1

正しい答えですが、OPが努力を分かち合うのを待つべきではありませんか? – Rajesh

+0

私はリンクが間違っていると思う...それは[地図](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map)ではない、それは['Array .prototype.map'](https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Array/map) – NonPolynomial

+0

@ NonPolynomial、右。それは間違った参照でした。 –

1

あなたはオブジェクトのキーとして整数を使用傾けます。だからあなたの例は不可能です。 この関連問題を参照してください:Javascript: Using integer as key in associative array?

+3

任意のタイプのキーを使用できます。文字列にオートボックスされます。 – NonPolynomial

+3

これは、オブジェクト内のプロパティにアクセスすることを強制するため、一般的には悪いことです。 console.log(normalisedRes ["3"])を実行する代わりに、console.log(normalisedRes.3)のようにエラーが発生します。 –

+3

'normalisedRes [3]'も正常に動作し、キーが計算される自動プロセス内では、ブラケット構文 – NonPolynomial

関連する問題