2017-05-04 241 views
0

我想出了這個解決方案,將一個字符串與一個對象數組進行比較。但是,我不認爲這是最好的解決方案。任何關於如何使這個函數對於大量對象更好的建議?將字符串與對象數組進行比較

var a = "blAh"; 
 
var b = [{ 
 
    "tag": "tag1", 
 
    "icons": ["blah"] 
 
}, { 
 
    "tag": "tag2", 
 
    "icons": ["Blah", "apple", "banana", "bLaH"] 
 
}]; 
 

 
// Desired output "tag1, tag2" 
 
function getTitle(tags, icon) { 
 
    let arr = []; 
 
    for (var i = 0; i < tags.length; i++) { 
 
    tags[i].icons.forEach(elem => { 
 
     if (icon.toLowerCase() === elem.toLowerCase()) { 
 
     if (!arr.includes(tags[i].tag)) { 
 
      arr.push(tags[i].tag); 
 
     } 
 
     } 
 
    }); 
 
    } 
 

 
    return arr.join(', '); 
 
} 
 
console.log(getTitle(b, a));

+0

你可以做'圖標= icon.toLowerCase()'進入循環前,但是你的實際問題是什麼?使用索引可以大大提高查找速度,但構建索引是額外的開銷。你也可以創建一個存儲值的索引,而不是'!arr.includes(tags [i] .tag)''''''''''''''''''''''''! – RobG

+0

我猜想唯一的改進就是在函數的開頭部分放置'icon.toLowerCase()'(將其存儲在一個變量中,這樣您就不會一遍又一遍地調用它)。如果你正在尋找一種可讀性而不是性能的改進,那麼使用'reduce','filter'和'concat',... –

+1

@ ibrahimmahrir-這是它的觀點:循環對性能非常好,並且非常易讀。儘管數組額外可以減少鍵入。 ;-) – RobG

回答

1

的可讀性,我會用以下內容:

var res = b.filter(el => 
    el.icons.length < 0 
    ? false 
    : el.icons.map(icon => icon.toLowerCase()).indexOf(a.toLocaleLowerCase()) != -1 
).map(el => el.tag).join(', '); 

但對於表演,這一次會更好:

var res = []; 
var i, j; 
for (i = 0; i < b.length; i++) { 
    if (b[i].icons.length < 0) { 
    } else { 
    for (j = 0; j < b[i].icons.length; j++) 
     b[i].icons[j] = b[i].icons[j].toLowerCase(); 
    if (b[i].icons.indexOf(a.toLocaleLowerCase()) !== -1) 
     res.push(b[i].tag); 
    } 
} 
res = res.join(', '); 

這是爲什麼:

  • indexOf始終快於includes(或在老版本的chrome中相同)。 benchmark
  • for循環始終比數組方法(如過濾器,映射或縮減)更快。基準測試:mapfilter

而且它intresting看到for loops are faster than indexOf in the latest version of chrome (60)

希望它能幫助,
最好的問候