[英]How do I get a specific object from an immutable js map by value?
我从对象列表中创建了一个不可变的映射(使用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();
基本上,不是:您按值而不是索引执行列表查找,因此它始终是线性遍历。
改进将是使用find
而不是filter
:
var result = map.find(function(obj){return obj.get('id') === 4;});
首先要注意的是,您实际上并没有创建地图,而是创建了一个列表:
var result = [{'id': 2}, {'id': 4}];
var map = Immutable.fromJS(result);
Immutable.Map.isMap(map); // false
Immutable.List.isList(map); // true
为了创建一个地图,您可以在toJS
调用( docs )中使用reviver
参数,但它肯定不是最直观的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
现在我们有一个适当的Immutable.js地图,它有一个get方法
var item = Map.get('a'); // {id: 'a'}
保证阵列的顺序可能很重要。 如果是这样的话:
以下示例使用“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' } ]
当使用fromJS作为数组时,你将获得List not map。 如果您创建地图将会更好,更容易。 以下代码将结果转换为Immutable地图。
const map = result.reduce((map, json) =>
map.set(json.id, Immutable.fromJS(json))
, Map());
现在你可以
map.get('2'); //{'id': 2}
注意,如果结果具有嵌套结构,并且如果它具有数组,则它将是具有上述代码的List。
使用ES2015语法 (和常量):
const result = map.find(o => o.get('id') === 4);
有没有办法更容易? 我不知道。 但你可以编写自己的函数。 这样的事情应该有效:
var myFunc = function(id){
var object = map.filter(function(obj){return obj.get('id') === id}).first();
return object;
}
然后你会做:
var myObj = myFunc(4);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.