列表中单词出现次数的计数,不区分大小写



获得不区分大小写的最专业的方法是什么?使用纯javascript的数组中包含的不同单词的计数?我自己做了第一次尝试,但感觉不太专业。

我希望结果是Map

您可以使用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), {})

要将其转换为Map,您可以使用Object.entries(由@ thophile建议):

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))

您可以使用对象来存储结果,然后通过将该对象传递给Object.entries来创建Map对象

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))

虽然接受的'group-by'操作很好,但它不能解决不区分大小写/unicode比较的复杂性。

首先,你可以在这里直接减少到一个地图,计算字符时不占不区分大小写或unicode变化导致20个不同的字符从一个数组的长度计算24。

const input = [ 'a', 'A', 'b', 'B', 'u00F1', 'u006Eu0303', 'İ', '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()并传递Turkey('tr')作为该特定示例数组的区域设置。它导致从长度为24的数组中计算出9个不同的字符,正确处理ñ的不同编码,Gesäß(GESÄSS)的等效拼写,并考虑区域设置特定的大小写变化(iİ)

const input = [ 'a', 'A', 'b', 'B', 'u00F1', 'u006Eu0303', 'İ', '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(', '), '}');

使用这个简单的"group-by",我们可以查看可用的大小写比较方法之间的变化:toLowerCase(),toLocaleLowerCase(),toUpperCase()toLocaleUpperCase(),并且可以使用normalize()来解释unicode变化

转小写

toLowerCase()- 15 'distinct'字符。

toLocaleLowerCase()- 14 'distinct'字符,在本例中指定土耳其('tr')作为区域设置。

normalize().toLocaleLowerCase()- 12 'distinct'字符,同样使用'tr'作为区域设置。

const input = [ 'a', 'A', 'b', 'B', 'u00F1', 'u006Eu0303', 'İ', 'i', 'Gesäß',
'GESÄSS', 'u0399', 'u1FBE', 'u00E5', 'u212B', 'u00C5', 'u212B', 'u0399', 'u1FBE', 'u03B9', 'u1FBE', 'u03B2', 'u03D0', 'u03B5', 'u03F5', ];
// ['a', 'A', 'b', 'B', 'ñ', 'ñ', 'İ', '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 'distinct'字符。

toLocaleUpperCase()- 11 'distinct'字符,在本例中指定土耳其('tr')作为区域设置。

normalize().toLocaleUpperCase()- 9 'distinct'字符,同样使用'tr'作为区域设置。

const input = [ 'a', 'A', 'b', 'B', 'u00F1', 'u006Eu0303', 'İ', 'i', 'Gesäß',
'GESÄSS', 'u0399', 'u1FBE', 'u00E5', 'u212B', 'u00C5', 'u212B', 'u0399', 'u1FBE', 'u03B9', 'u1FBE', 'u03B2', 'u03D0', 'u03B5', 'u03F5', ];
// ['a', 'A', 'b', 'B', 'ñ', 'ñ', 'İ', '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; }

使用set删除重复项,并使用spread操作符将其放回数组中。

const  myarray = ['one', 'One', 'two', 'TWO', 'three'];
const noDupes = [... new Set( myarray.map(x => x.toLowerCase()))];
console.log(noDupes);

最新更新