将一个字符串转换为一个数字字符串,表示每个字母在字母表中的位置(' a'是' z'是26)

时间:2018-06-16 13:01:54

标签: javascript

我需要创建一个函数alphabetIndexer,它将一个字符串作为参数,并返回一个数字字符串,表示每个字母在字母表中的位置(' a'是1,' z&# 39;是26)。如果字符为大写,则将其位置乘以2.应忽略字符串中非字母的所有字符。

function alphabetIndexer(str){
    let alphabet = 'abcdefghigklmnopqrstuvwxyz';
    let arr = [];
    for(let i = 0; i < str.length; i++){
        if(alphabet.includes(str[i].toLowerCase())){
            if(str[i] === str[i].toUpperCase()){
                arr.push(alphabet.indexOf((str[i] +1)*2))
            } else {
            arr.push(alphabet.indexOf(str[i]) +1);
            }
        }
    }
            return arr.join(' ');
}

我无法将UpperCase字母位置乘以2;

在测试案例&#34; Hello World&#34;它应该返回&#34; 16 5 12 12 15 46 15 17 12 4&#34; 但我的函数返回[-1,5,12,12,15,-1,15,18,12,4]

3 个答案:

答案 0 :(得分:5)

你已经有了一个好的开始,你的错误已经让你的括号错了。这样:

arr.push(alphabet.indexOf((str[i] +1)*2))

应该是

arr.push((alphabet.indexOf(str[i]) +1)*2)

如果符合以下条件会更清楚:

  • 您将str[i]放入变量中,而不是每次都查找
  • 运营商周围的空间

: - )

即:

arr.push((alphabet.indexOf(ch) + 1) * 2)

第二个问题是,您在执行toLowerCase检查时只执行includes事项,而在执行indexOf时不会执行alphabet事。您需要在查看function alphabetIndexer(str) { let alphabet = 'abcdefghigklmnopqrstuvwxyz'; let arr = []; for (let i = 0; i < str.length; i++) { if (alphabet.includes(str[i].toLowerCase())) { if (str[i] === str[i].toUpperCase()) { arr.push((alphabet.indexOf(str[i].toLowerCase()) + 1) * 2); // *** } else { arr.push(alphabet.indexOf(str[i].toLowerCase()) + 1); // *** } } } return arr.join(' '); } console.log(alphabetIndexer("Hi there"));的所有三个位置执行此操作:

&#13;
&#13;
"use strict";
function alphabetIndexer(str) {
  let alphabet = 'abcdefghigklmnopqrstuvwxyz';
  let arr = [];
  for (let ch of str) { // Strings are iterable
    // Only search `alphabet` once
    let index = alphabet.indexOf(ch.toLowerCase());
    if (index !== -1) {
      if (ch === ch.toUpperCase()) {
        arr.push((index + 1) * 2);
      } else {
        arr.push(index + 1);
      }
    }
  }
  return arr.join(' ');
}
console.log(alphabetIndexer("Hi there"));
&#13;
&#13;
&#13;

对于它的价值,这里有一些小的改变(不改变你的整体方法):

&#13;
&#13;
const
&#13;
&#13;
&#13;

您也可以考虑将arr用于&#34;变量&#34;你永远不会改变(有趣的是,那些代码中的所有内容;更改arr状态并不会改变变量extract = Model(model.input, [model.get_layer('dense_1').output, model.output]) features, labels = extract.predict(x_test) labels = np.argmax(labels, axis=1) 的内容)。

答案 1 :(得分:0)

arr.push((alphabet.indexOf(str[i]) +1)*2);
这显然是错误的地方。你确定你的* 2应该在indexOf参数中吗?试试这个:

viewBox

编辑:考虑为什么它会给你-1,这也是一个好主意。我不太确定,因为我自己没有Java 脚本专家。

答案 2 :(得分:0)

您可以使用.charCodeAt()获取ASCII值,然后从0减去偏移量。

const CAPS_OFFSET  = 64;
const LOWER_OFFSET = 96;
const ALPHA_ONLY   = /[a-zA-Z]/;

console.log( alphabetIndexer('Hello World') );


function alphabetIndexer(str) {  

  let arr = Array.from(str, letter=>{
    if (!ALPHA_ONLY.test(letter)) return;
    let ascii = letter.charCodeAt(0)
    return ascii > LOWER_OFFSET ? ascii - LOWER_OFFSET : (ascii - CAPS_OFFSET)*2;
  });
  
  return arr.join(' ')
}