web-dev-qa-db-ja.com

オブジェクトへのJavascriptアンダースコア配列

アンダースコアを使用してこれを変える簡単でクリーンな方法はありますか?

[ { id: 'medium', votes: 7 },
  { id: 'low',    votes: 9 },
  { id: 'high',   votes: 5 } ]

 { 'low'    : 9,
   'medium' : 7,
   'high'   : 5 }
15
TheBigC
var data = [ { id: 'medium', votes: 7 },
  { id: 'low',    votes: 9 },
  { id: 'high',   votes: 5 } ];

これは _.map_.values および _.object 、このように

console.log(_.object(_.map(data, _.values)));
# { medium: 7, low: 9, high: 5 }

説明

map関数を使用して、valuesのすべての要素にdata関数(特定のオブジェクトのすべての値を取得)を適用します。

# [ [ 'medium', 7 ], [ 'low', 9 ], [ 'high', 5 ] ]

次に、object関数を使用してこれをオブジェクトに変換します。

17
thefourtheye

_.indexBy(...)を検討してください

var data = [{
    id: 1,
    name: 'Jon Doe',
    birthdate: '1/1/1991',
    height: '5 11'
}, {
    id: 2,
    name: 'Jane Smith',
    birthdate: '1/1/1981',
    height: '5 6'
}, {
    id: 3,
    name: 'Rockin Joe',
    birthdate: '4/4/1994',
    height: '6 1'
}, {
    id: 4,
    name: 'Jane Blane',
    birthdate: '1/1/1971',
    height: '5 9'
}, ];

var transformed = _.indexBy(data, 'id');

ここにフィドルがあります: https://jsfiddle.net/4vyLtcrf/3/

更新:Lodash 4.0.1では、メソッド_.indexByは_.keyByに名前が変更されました。

43
kroolk

これがVanillajsの場合です。

var result = {};
[ { id: 'medium', votes: 7 },
  { id: 'low',    votes: 9 },
  { id: 'high',   votes: 5 } ].forEach(function(obj) {
    result[obj.id] = obj.votes;
});
console.log(result);
8
Krasimir

私と一緒にもっと簡単に:each

   var t = {};
   _.each(x, function(e){
     t[e.id] = e.votes;
   });
//--> {medium: 7, low: 9, high: 5}
2
nguyên

アンダースコアの最も強力な方法はreduceです。あなたはそれでほとんど何でもすることができます。そして、より大きな利点は、コレクションを1回だけ繰り返すことです。

var array = [ 
    { id: 'medium', votes: 7 },
    { id: 'low',    votes: 9 },
    { id: 'high',   votes: 5 } 
];
var object = _.reduce(array, function(_object, item) { 
    _object[item.id] = item.votes; 
    return _object; 
}, {});

実行後、オブジェクトは次のようになります。

{
  medium:7,
  low:9,
  high:5
}
1
Oscar Eduardo

これは、ネイティブJSArray.reduceで実行できます。

const myArray = [ { id: 'medium', votes: 7 },
{ id: 'low',    votes: 9 },
{ id: 'high',   votes: 5 } ]

const myObject = myArray.reduce((obj, item)=>{
  o[item.id] = item.votes
  return o
}, {})

詳細については、 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce をご覧ください。

0
Jo-Go

IndexByを使用する

_.indexBy([ 
   { id: 'medium', votes: 7 },
   { id: 'low',    votes: 9 },
   { id: 'high',   votes: 5 } 
 ], 'id');
0
udnisap

これは古い投稿ですが、_.reduceを使用してクリーンな方法で変換を行うことができます

var data = [
    { id: 'medium', votes: 7 },
    { id: 'low',    votes: 9 },
    { id: 'high',   votes: 5 }
]

var output = _.reduce(data, function(memo, entry) {
    memo[entry.id] = entry.votes;
    return memo;
}, {});

console.log(output);
0
MarkoCen