如何通过值从不可变的js映射中获取特定对象?

ssp*_*oss 35 javascript immutability

我从对象列表中创建了一个不可变的映射(使用Immutable-JS):

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

现在我想得到对象id = 4.

有没有比这更简单的方法:

var object = map.filter(function(obj){
 return obj.get('id') === 4
}).first();
Run Code Online (Sandbox Code Playgroud)

blg*_*lgt 53

本质上,不是:您按值而不是索引执行列表查找,因此它始终是线性遍历.

改进将是使用find而不是filter:

var result = map.find(function(obj){return obj.get('id') === 4;});
Run Code Online (Sandbox Code Playgroud)


Jos*_*hua 13

首先要注意的是,您实际上并没有创建地图,而是创建了一个列表:

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

Immutable.Map.isMap(map); // false
Immutable.List.isList(map); // true
Run Code Online (Sandbox Code Playgroud)

为了创建地图,您可以revivertoJS调用中使用参数(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
Run Code Online (Sandbox Code Playgroud)

现在我们有一个适当的Immutable.js地图,它有一个get方法

var item = Map.get('a'); // {id: 'a'}
Run Code Online (Sandbox Code Playgroud)