使用普通javascript獲取陣列中包含的不同單詞的不區分大小寫計數的最專業方法是什么?我自己做了第一次嘗試,但感覺不太專業。
我希望結果是地圖
uj5u.com熱心網友回復:
您可以使用Array.reduce將每個單詞存盤為一個屬性,并將每個單詞的出現次數存盤為值。
在 reducer 函式中,檢查字母(轉換為小寫)是否作為屬性存在。如果不是,請將其值設定為1。否則,增加屬性值。
const arr = ["a", "A", "b", "B"]
const result = arr.reduce((a,b) => {
let c = b.toLowerCase();
return a[c] = a[c] ? a[c] : 1, a;
}, {})
console.log(result)
作為一個班輪: const result = arr.reduce((a,b) => (c = b.toLowerCase(), a[c] = a[c] ? a[c] : 1, a), {})
要將其轉換為 a Map,您可以使用Object.entries(由@Théophile 建議):
const arr = ["a", "A", "b", "B"]
const result = arr.reduce((a, b) => {
let c = b.toLowerCase();
return a[c] = a[c] ? a[c] : 1, a;
}, {})
const m = new Map(Object.entries(result))
m.forEach((value, key) => console.log(key, ':', value))
uj5u.com熱心網友回復:
您可以使用一個物件來存盤結果,然后Map通過將該物件傳遞給創建一個物件Object.entries
const arr = ["c", "A", "C", "B", "b"];
const counts = {};
for (const el of arr) {
let c = el.toLowerCase();
counts[c] = counts[c] ? counts[c] : 1;
}
console.log(counts);
const map = new Map(Object.entries(counts))
map.forEach((k,v) => console.log(k,v))
uj5u.com熱心網友回復:
雖然接受的“group-by”操作很好,但它沒有解決不區分大小寫/unicode 比較的復雜性。
首先,您可以直接減少到Map,這里按原樣計算字符,而不考慮大小寫不敏感或 unicode 變化,導致從長度為 24 的陣列中計算出 20 個“不同”字符。
const input = [ 'a', 'A', 'b', 'B', '\u00F1', '\u006E\u0303', '?', 'i', 'Ges??',
'GES?SS', '\u0399', '\u1FBE', '\u00E5', '\u212B', '\u00C5', '\u212B', '\u0399', '\u1FBE', '\u03B9', '\u1FBE', '\u03B2', '\u03D0', '\u03B5', '\u03F5', ];
const result = input.reduce((a, b) => a.set(b, (a.get(b) ?? 0) 1), new Map());
console.log('distinct count: ', result.size); console.log('Map(',result.size,') {', [...result.entries()].map(([k, v]) => `${k} => ${v}`).join(', '), '}');
根據下面的示例,產生最緊湊計數的方法是使用word.normalize().toLocaleUpperCase()并傳遞土耳其 ('tr') 作為此特定示例陣列的區域設定。它導致從長度為 24 的陣列中計算出 9 個“不同”字符,正確處理 的不同編碼?、Ges??( GES?SS) 的等效拼寫,并考慮語言環境特定的大小寫更改 ( ito ?)
const input = [ 'a', 'A', 'b', 'B', '\u00F1', '\u006E\u0303', '?', 'i', 'Ges??',
'GES?SS', '\u0399', '\u1FBE', '\u00E5', '\u212B', '\u00C5', '\u212B', '\u0399', '\u1FBE', '\u03B9', '\u1FBE', '\u03B2', '\u03D0', '\u03B5', '\u03F5', ];
const result_normalize_locale = input.reduce((a, b) => {
const w = b.normalize().toLocaleUpperCase('tr');
return a.set(w, (a.get(w) ?? 0) 1);
}, new Map());
console.log('distinct count: ', result_normalize_locale.size); console.log('Map(',result_normalize_locale.size,') {', [...result_normalize_locale.entries()].map(([k, v]) => `${k} => ${v}`).join(', '), '}');
使用這個簡單的“組由”大家可以看一下可用的情況下,比較方法之間的差異:toLowerCase(),toLocaleLowerCase(),toUpperCase(),和toLocaleUpperCase()和Unicode的變化可占使用normalize()
小寫
toLowerCase() – 15 個“不同”的字符。
toLocaleLowerCase() – 14 個“distinct”字符,在這種情況下,將土耳其('tr') 指定為語言環境。
normalize().toLocaleLowerCase() – 12 個“不同”字符,同樣以“tr”作為語言環境。
const input = [ 'a', 'A', 'b', 'B', '\u00F1', '\u006E\u0303', '?', 'i', 'Ges??',
'GES?SS', '\u0399', '\u1FBE', '\u00E5', '\u212B', '\u00C5', '\u212B', '\u0399', '\u1FBE', '\u03B9', '\u1FBE', '\u03B2', '\u03D0', '\u03B5', '\u03F5', ];
// ['a', 'A', 'b', 'B', '?', 'n?', '?', 'i', 'Ges??', 'GES?SS', 'Ι', '?', '?', '?', '?', '?', 'Ι', '?', 'ι', '?', 'β', '?', 'ε', '?', ]
// input.length: 24
// grouping by toLowerCase()
const result = input.reduce((a, b) => {
const w = b.toLowerCase();
return a.set(w, (a.get(w) ?? 0) 1);
}, new Map());
// grouping by toLocaleLowerCase('tr') [Turkey]
const result_locale = input.reduce((a, b) => {
const w = b.toLocaleLowerCase('tr');
return a.set(w, (a.get(w) ?? 0) 1);
}, new Map());
// grouping by normalize().toLocaleLowerCase('tr') [Turkey]
const result_normalize_locale = input.reduce((a, b) => {
const w = b.normalize().toLocaleLowerCase('tr');
return a.set(w, (a.get(w) ?? 0) 1);
}, new Map());
// log toLowerCase() result - 15 'distinct' characters
console.log('toLowerCase() '); console.log('distinct count: ', result.size); console.log('Map(',result.size,') {', [...result.entries()].map(([k, v]) => `${k} => ${v}`).join(', '), '}');
// log toLocaleLowerCase('tr') result - 14 'distinct' characters
console.log("\ntoLocaleLowerCase('tr')"); console.log('distinct count: ', result_locale.size); console.log('Map(',result_locale.size,') {', [...result_locale.entries()].map(([k, v]) => `${k} => ${v}`).join(', '), '}');
// log normalize().toLocaleLowerCase('tr') result - 12 'distinct' characters
console.log("\nnormalize().toLocaleLowerCase('tr')"); console.log('distinct count: ', result_normalize_locale.size); console.log('Map(',result_normalize_locale.size,') {', [...result_normalize_locale.entries()].map(([k, v]) => `${k} => ${v}`).join(', '), '}');
.as-console-wrapper { max-height: 100% !important; top: 0; }
大寫
toUpperCase() – 12 個“不同”的字符。
toLocaleUpperCase() – 11 個“distinct”字符,在本例中將土耳其('tr') 指定為語言環境。
normalize().toLocaleUpperCase() – 9 個“不同”字符,同樣以“tr”作為語言環境。
const input = [ 'a', 'A', 'b', 'B', '\u00F1', '\u006E\u0303', '?', 'i', 'Ges??',
'GES?SS', '\u0399', '\u1FBE', '\u00E5', '\u212B', '\u00C5', '\u212B', '\u0399', '\u1FBE', '\u03B9', '\u1FBE', '\u03B2', '\u03D0', '\u03B5', '\u03F5', ];
// ['a', 'A', 'b', 'B', '?', 'n?', '?', 'i', 'Ges??', 'GES?SS', 'Ι', '?', '?', '?', '?', '?', 'Ι', '?', 'ι', '?', 'β', '?', 'ε', '?', ]
// input.length: 24
// grouping by toUpperCase()
const result = input.reduce((a, b) => {
const w = b.toUpperCase();
return a.set(w, (a.get(w) ?? 0) 1);
}, new Map());
// grouping by toLocaleUpperCase('tr') [Turkey]
const result_locale = input.reduce((a, b) => {
const w = b.toLocaleUpperCase('tr');
return a.set(w, (a.get(w) ?? 0) 1);
}, new Map());
// grouping by normalize().toLocaleUpperCase('tr') [Turkey]
const result_normalize_locale = input.reduce((a, b) => {
const w = b.normalize().toLocaleUpperCase('tr');
return a.set(w, (a.get(w) ?? 0) 1);
}, new Map());
// log toUpperCase() result - 12 'distinct' characters
console.log('toUpperCase() '); console.log('distinct count: ', result.size); console.log('Map(',result.size,') {', [...result.entries()].map(([k, v]) => `${k} => ${v}`).join(', '), '}');
// log toLocaleUpperCase('tr') result - 11 'distinct' characters
console.log("\ntoLocaleUpperCase('tr')"); console.log('distinct count: ', result_locale.size); console.log('Map(',result_locale.size,') {', [...result_locale.entries()].map(([k, v]) => `${k} => ${v}`).join(', '), '}');
// log normalize().toLocaleUpperCase('tr') result - 9 'distinct' characters
console.log("\nnormalize().toLocaleUpperCase('tr')"); console.log('distinct count: ', result_normalize_locale.size); console.log('Map(',result_normalize_locale.size,') {', [...result_normalize_locale.entries()].map(([k, v]) => `${k} => ${v}`).join(', '), '}');
.as-console-wrapper { max-height: 100% !important; top: 0; }
uj5u.com熱心網友回復:
使用 set 去除重復項,使用擴展運算子將其放回陣列中。
const myarray = ['one', 'One', 'two', 'TWO', 'three'];
const noDupes = [... new Set( myarray.map(x => x.toLowerCase()))];
console.log(noDupes);
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/312955.html
標籤:javascript 字典 不区分大小写
下一篇:在字典中的串列中搜索字典
