如何从 javascript 中的字符串中获取唯一字符列表?
how to get list of unique chars from a string in javascript?
我有一些文本文件,每个文件都混合了中西文字。我想要一个出现在每个文件中的汉字列表。
我试过了
ch = text.match(/[\u4E00-\u9FFF]/g); // unicode usual chinese characters - that'll do for me
if (ch != null) {
alert(ch);
}
这给了我汉字列表,但有一些重复。例如:
肉,捕,兵,死,兵,半,水
一个文件
卵,水,半,水,土,木,水,清,慢,底,海,海,海,清,清,清,木,清,慢,底,清,土,半,水,水,土,半,水,土
另一个...
1) 我不需要那些逗号。哪儿来的呢? (我可以通过一次替换将它们删除,但由于我使用的是正则表达式,我认为如果我在正则表达式本身内解决它可能会更快。)
2) 如何只获取唯一值?例如:
肉捕兵死半水
第一个文件
卵水半土木清慢底海
第二次...
逗号来自默认数组到字符串的转换。使用 ch.join('')
将数组转换为字符串。
要删除重复值,请使用此行:
ch = text.match(/([\u4E00-\u9FFF])/g);
ch = ch.filter(function (c, i) { return ch.indexOf(c) === i; }).join('');
Array.prototype.getUnique = function(){
var u = {}, a = [];
for(var i = 0, l = this.length; i < l; ++i){
if(u.hasOwnProperty(this[i])) {
continue;
}
a.push(this[i]);
u[this[i]] = 1;
}
return a;
}
ch = text.match(/([\u4E00-\u9FFF])/g);
var result_string = ch.getUnique().join("");
试试这个:
var text = "卵水半水土木水清慢底海海海清清清木清慢底清土半水水土半水土",
re = /([\u4E00-\u9FFF])/g,
unique = {},
chars = "", c;
while(c = re.exec(text)){
if(!unique[c[0]]){
chars += c[0];
unique[c[0]] = true;
}
}
chars.split("");
返回:
["卵", "水", "半", "土", "木", "清", "慢", "底", "海"]
是的,您看到的逗号是浏览器将数组类型转换为字符串时出现的:它将每个值的字符串表示形式与逗号连接在一起。我猜这是来自您原始示例中对 "alert" 的调用,该示例被提供了一个数组(从字符串的 "Match" 方法返回)。
Array 的 "filter" 方法在旧版浏览器中不受支持,但它很容易进行 polyfill(如果您只关心支持最新的 IE9 代理,当然没有必要这样做)。
有一个使用正则表达式的单行解决方案:
input.match(/([\u4E00-\u9FFF])(?![\s\S]*)/g)
但是,我不建议使用它,因为在最坏的情况下(当字符串主要包含汉字时)它的复杂度为 O(n * k),其中n 是字符串的长度,k 是唯一汉字的个数。为什么是 O(n * k)?因为前瞻 (?![\s\S]*)
基本上说 "assert that you can't find another instance of whatever matched in first capturing group in the rest of the string".
@Ruben Kazumov 的 是一个合理的选择。它的复杂度取决于在对象中设置和获取 属性 的实现,在合理的实现中,每个操作应该是次线性的。
我有一些文本文件,每个文件都混合了中西文字。我想要一个出现在每个文件中的汉字列表。
我试过了
ch = text.match(/[\u4E00-\u9FFF]/g); // unicode usual chinese characters - that'll do for me
if (ch != null) {
alert(ch);
}
这给了我汉字列表,但有一些重复。例如:
肉,捕,兵,死,兵,半,水
一个文件
卵,水,半,水,土,木,水,清,慢,底,海,海,海,清,清,清,木,清,慢,底,清,土,半,水,水,土,半,水,土
另一个...
1) 我不需要那些逗号。哪儿来的呢? (我可以通过一次替换将它们删除,但由于我使用的是正则表达式,我认为如果我在正则表达式本身内解决它可能会更快。)
2) 如何只获取唯一值?例如:
肉捕兵死半水
第一个文件
卵水半土木清慢底海
第二次...
逗号来自默认数组到字符串的转换。使用 ch.join('')
将数组转换为字符串。
要删除重复值,请使用此行:
ch = text.match(/([\u4E00-\u9FFF])/g);
ch = ch.filter(function (c, i) { return ch.indexOf(c) === i; }).join('');
Array.prototype.getUnique = function(){
var u = {}, a = [];
for(var i = 0, l = this.length; i < l; ++i){
if(u.hasOwnProperty(this[i])) {
continue;
}
a.push(this[i]);
u[this[i]] = 1;
}
return a;
}
ch = text.match(/([\u4E00-\u9FFF])/g);
var result_string = ch.getUnique().join("");
试试这个:
var text = "卵水半水土木水清慢底海海海清清清木清慢底清土半水水土半水土",
re = /([\u4E00-\u9FFF])/g,
unique = {},
chars = "", c;
while(c = re.exec(text)){
if(!unique[c[0]]){
chars += c[0];
unique[c[0]] = true;
}
}
chars.split("");
返回:
["卵", "水", "半", "土", "木", "清", "慢", "底", "海"]
是的,您看到的逗号是浏览器将数组类型转换为字符串时出现的:它将每个值的字符串表示形式与逗号连接在一起。我猜这是来自您原始示例中对 "alert" 的调用,该示例被提供了一个数组(从字符串的 "Match" 方法返回)。
Array 的 "filter" 方法在旧版浏览器中不受支持,但它很容易进行 polyfill(如果您只关心支持最新的 IE9 代理,当然没有必要这样做)。
有一个使用正则表达式的单行解决方案:
input.match(/([\u4E00-\u9FFF])(?![\s\S]*)/g)
但是,我不建议使用它,因为在最坏的情况下(当字符串主要包含汉字时)它的复杂度为 O(n * k),其中n 是字符串的长度,k 是唯一汉字的个数。为什么是 O(n * k)?因为前瞻 (?![\s\S]*)
基本上说 "assert that you can't find another instance of whatever matched in first capturing group in the rest of the string".