[英]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.