web-dev-qa-db-ja.com

値で不変のjsマップから特定のオブジェクトを取得するにはどうすればよいですか?

オブジェクトのリストから不変のマップを作成しました( Immutable-JS を使用):

var result = [{'id': 2}, {'id': 4}];
var map = Immutable.fromJS(result);

今、私はid = 4でオブジェクトを取得したい。

これより簡単な方法があります:

var object = map.filter(function(obj){
 return obj.get('id') === 4
}).first();
35
sspross

基本的に、いいえ:インデックスではなく値でリスト検索を実行しているため、常に線形トラバーサルになります。

改善はfindの代わりにfilterを使用することです:

var result = map.find(function(obj){return obj.get('id') === 4;});
53
blgt

最初に注意することは、実際にマップを作成するのではなく、リストを作成することです。

var result = [{'id': 2}, {'id': 4}];
var map = Immutable.fromJS(result);

Immutable.Map.isMap(map); // false
Immutable.List.isList(map); // true

マップを作成するには、reviver呼び出しでtoJS引数を使用できます( docs )が、それは確かに最も直感的なAPIではありません。何かのようなもの:

// lets use letters rather than numbers as numbers get coerced to strings anyway
var result = [{'id': 'a'}, {'id': 'b'}];
var map = Immutable.Map(result.reduce(function(previous, current) { 
    previous[ current.id ] = current;
    return previous;
}, {}));

Immutable.Map.isMap(map); // true

これで、getメソッドを持つ適切なImmutable.jsマップができました。

var item = Map.get('a'); // {id: 'a'}
13
Joshua

配列の順序を保証することが重要な場合があります。だとしたら:

  1. OrderedMapを使用する
  2. ソース配列の各反復でOrderedMapでsetメソッドを実行します

以下の例では、パフォーマンスを向上させるために「withMutations」を使用しています。

var OrderedMap = Immutable.OrderedMap


// Get new OrderedMap
function getOm(arr) {
    return OrderedMap().withMutations(map => {
        arr.forEach(item => map.set(item.id, item))
    })
}

// Source collection
var srcArray = [
    {
        id: 123,
        value: 'foo'
    },
    {
        id: 456,
        value: 'bar'
    }
]


var myOrderedMap = getOm(srcArray)

myOrderedMap.get(123)
// --> { id: 123, value: 'foo' }

myOrderedMap.toObject()
// --> { 123: {id: 123, value: 'foo'}, 456: {id: 456, value: 'bar'} }

myOrderedMap.toArray()
// --> [ {id: 123, value: 'foo'}, { id: 456, value: 'bar' } ]
4
eezing

FromJSを配列に使用すると、マップではなくリストが取得されます。マップを作成すると、より簡単になります。次のコードは、結果を不変マップに変換します。

  const map = result.reduce((map, json) =>
    map.set(json.id, Immutable.fromJS(json))
  , Map());

今、あなたはできる

   map.get('2');   //{'id': 2}

結果にネストされた構造があり、配列がある場合、上記のコードのリストになることに注意してください。

4
Anand Dayalan

ES2015構文(および定数)の場合:

const result = map.find(o => o.get('id') === 4);
3
roadev