我要创建一个程序,可以采取一个句子,如与第一次出现
my arms are red, my legs are red and I am red
和输出的句子与词第一次出现在句子中的指针的指针替换文本中的字,所以这句话的期望输出将是
12341634910114
我不知道我该怎么做。
感谢
我要创建一个程序,可以采取一个句子,如与第一次出现
my arms are red, my legs are red and I am red
和输出的句子与词第一次出现在句子中的指针的指针替换文本中的字,所以这句话的期望输出将是
12341634910114
我不知道我该怎么做。
感谢
这里是一个办法。
key=word
和value=first
的地图。var text = "my arms are red, my legs are red and i am red";
// remove punctuation
text = text.replace(/[.,\/#!$%\^&\*;:{}=\-_`~()]/g,"");
// split text
var words = text.split(" ");
// create map of word and first index
var m = new Map();
var i = 1;
words.forEach(function(word) {
// first occurrence?
if (m.get(word) == undefined) {
m.set(word, i++);
}
});
// replace words with index
var l = [];
words.forEach(function(word) {
l.push(m.get(word));
});
console.log(l.join(""));
有一定短的方式来做到这一点,但我觉得这是更容易阅读和理解
这里的理念是:
你必须打破一句成词。断点可能是SPACE,COMMA,NEW LINE等。
您可以创建2个数组。第一个包含所有的单词,第二个包含唯一的单词。
运行均通过环比较它们对一个词的第一次出现的阵列,并保存其指数
使用独特的数组而不是地图的好处:) – ppasler
你已经做了你的问题是错误的。如果重复一个词,索引应该被填充。 因此指数应该是 12341634910114(123416349,10,11,4)
var str="my arms are red, my legs are red and i am red";
var words=str.replace(",","").split(" ");
var occur=[];
var pos=[];
//console.log(words.length);
for(var i=0; i< words.length; i++){
if(occur.length==0){
occur.push([words[i],i]);
pos.push(pos.length+1);
}
else{
for(var j=0; j<occur.length; j++){
if(words[i]==occur[j][0]){
pos.push(occur[j][1]+1);
break;
}
}
if(j>=occur.length){ // the loop is not broken
occur.push([words[i],i]);
pos.push(i+1);
}
}
}
console.log(pos.join(""));
//console.log(occur);
//console.log(occur[1][0]);
在单词边界分割.match(/\b(\w+)\b/g)
使用Array.map将每个单词映射到的数发生。
使用Array.slice
查找切片数组到达当前索引的出现次数,并在该切片阵列上使用Array.filter
查找出现次数。
同样的事情可以用很多不同的方式完成,例如使用简单的循环。
var result = "my arms are red, my legs are red and i am red?".match(/\b(\w+)\b/g).map(function(currentValue, index, array){
return array.slice(0, index + 1).filter(x => x === currentValue).length;
}).join("");
console.log("result", result);
你有什么已经尝试过? – ppasler