我要創建一個程序,可以採取一個句子,如與第一次出現
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