習慣沉默2017-07-05 10:56:21
用 filter()
確實可以一句話搞定,但是,效率不高。其實可以用 find
(參考 MDN)
function getServiceTypeName(code) {
return serviceTypeList.find(val => val.name === code);
}
可惜 IE 不支援 find()
,所以在 MDN 文件快結束的地方,有一個 Polyfill。
如果說採用 map 來實現,也不需要用 ES6 的 Map,因為原生物件就支援 string 類型的 key,但不管怎麼實現,這個 map 的轉換應該在 getServiceTypeName
之外進行。因為轉換的過程比你寫的 for ... of
更耗時。
function toMap(list) {
return list.reduce((map, item) => {
map.set(item.name, item);
return map;
}, new Map());
}
serviceTypeMap = toMap(serviceTypeList);
function getServiceTypeName(code) {
return serviceTypeMap.get(code);
}
代言2017-07-05 10:56:21
objToStrMap初始化一次就可以了,你循環中每次都在初始化,這樣會比較慢。
補充說明
const objToStrMap=function (obj) {
var myMap=new Map();
obj.forEach(
(item) => myMap.set(item.typeId, item.name)
);
return myMap;
}
var serviceTypeList=[
{
'typeId':1,
'name':'first'
},
{
'typeId':2,
'name':'second'
},
]
function init(){
serviceTypeList= objToStrMap(serviceTypeList)
}
init();//预先初始化,应用启动前或确保在getServiceTypeName服务调用前已经被初始化完成。
getServiceTypeName=function (code) {
return serviceTypeList.get(code);
}
console.log(getServiceTypeName(2)); //输出:second
为情所困2017-07-05 10:56:21
...
先轉成鍵值對為name:Id的map結構。然後就可以直接用name去拿對應的id。你完全沒搞懂他給你說的方法的意思。
先把type數組轉換成map結構,然後透過map.get(code)去拿就好了。不用遍歷。
阿神2017-07-05 10:56:21
function中,可以這樣寫
let result = serviceTypeList.map((val)=> val.typeId === code);
retVal = result.name;
女神的闺蜜爱上我2017-07-05 10:56:21
循環裡做filter這個操作本身不慢的。
什麼轉成map的方案需要考慮轉換本身的開銷
一部分語言自帶的map實現,在集合很小的時候用的就是數組,省去了hashcode的操作反而提高效率