Ejercicios con el objeto String

El objeto string es el objeto usado por Javascript para manejar los datos de tipo cadena. Este tipo de datos está formado por secuencias de caracteres, donde cada carácter es accesible por su posición comenzando desde 0. Aquí se pretende que practiques con los métodos del objeto.
Lo que se pide
Aclaraciones

Crea una función que reciba como argumento una cadena de caracteres y devuelva una cadena con todas las vocales y el número de veces que aparece cada una en la cadena argumento.

Procura usar prioritariamente los métodos del objeto string

Ejemplo cuentaVocales("Hola soy Pepe") deberá imprimir a:1, e:2, i:0, o:2, u:0

function cuentaVocales(frase){
   const vocales="aeiou";
   let veces =[0,0,0,0,0];
   let res='', car, pos;
   frase = frase.toLowerCase();
   for(let i=0; i < frase.length; i++){
     car = frase.charAt(i);
     pos = vocales.indexOf(car);
     if (pos >=0){
          veces[pos]++
         }
     }
for(let j=0; j < vocales.length; j++){
     res += vocales.charAt(j)+":"+veces[j]+"/";
}
return res ;
}

En esta ocasión se trata de crear una función que reciba como argumento una frase con letras y números. La función debe devolver la suma de todos los dígitos contenidos en la frase
Al ejecutar cambiaCars("Estamos a 7 días de navidad y faltan 10 días para fin del año 2022), deberá devolver el número 14 (7+1 + 0 +2+0+2+2)

function sumaDigs(frase){
    let digito='', suma=0;
    for(let i = 0; i < frase.length; i++){
        digito = parseInt(frase.charAt(i));
        if (!isNaN(digito)){
            suma += digito;
        }
    }
    return suma
}

Crea una función javascript que reciba como argumento una frase y que devuelva el número de espacios, dígitos y letras  contenidos en la frase. Puedes usar expresiones regulares
Si llamo al a funcion contarCars("Si, hoy es dia 10") debería devolver
2 digitos, 4 espacios y 10 letras

function contarCars(frase){
   let esp,dig, let, lista;
   lista = frase.match(/\s/g);
   esp = lista.length;
   lista = frase.match(/[0-9]/g);
   dig = lista.length;
   lista = frase.match(/[a-z]/gi);
   let = lista.length;
   console.log("Hay "+esp+" espacios");
   console.log("Hay "+dig+" digitos");
   console.log("Hay "+let+" letras");
}

Escribe una función recursiva que cuente el número de veces que un carácter dado aparece en una cadena. La función recibe como argumentos la cadena y el carácter buscado.
Por ejemplo contarLetra("Hoy es martes" , 'e') devolverá 2 porque hay dos letras e en la cadena.

function contarCars(frase, car){
   let resto
   if (frase.length==1){
      return (frase[0] == car)?1:0
   }
   num = (frase[0] == car)?1:0;
   resto = frase.substring(1)
   return num + contarCars(resto, car);
}

Escribe una función que reciba como argumento una frase y devuelva la misma frase pero con la inicial de cada palabra en mayúsculas
Por ejemplo cambInicial("pero no tengo hambre ") debería devolver la frase Pero No Tengo Hambre

function cambiarIni(frase){
   let lista=frase.split(" ");
   let ini, pal, cambiada;
   cambiada = lista.map(function(v,i,l){
   ini = v.charAt(0).toUpperCase();
   pal = ini.concat(v.substring(1));
   return pal
   })

   return cambiada.join(" ");
}

Se trata de crear una función que decodifique un código de producto. El código contiene tres partes separadas por un guión:

Dos caracteres:  CP: cliente particular, CE: empresa

Dos dígitos: 10 Local, 11 Autonómico, 12 Nacional, 20 Internacional

Una cifra que indica el número de años de antigüedad del cliente.

Si el código es erróneo la función deberá informar del tipo de erorr o errores.

Por ejemplo descifrar("CP-12-3") deberá devolver Cliente paticular nacional con 3 años de antiguedad

function descifrar(codigo){
let tipo, local, ant;
let msg = '';
switch (codigo.substring(0,2)){
   case "CP":
   tipo = "Particular";
break;
   case "CE":
tipo = "Empresa";
break;
default:
msg += " Error de cliente";
}
switch (codigo.substring(3,5)){
   case "00":
     local = "Local";
      break;
   case "01":
      local = "Nacional";
      break;
   case "11":
      local = "Internacional";
      break;
   default:
      msg += " Error en origen";
}
   ant = codigo.substring(6);
   if (msg.length ==0){
      msg = "cliente "+tipo+" "+local+" con "+ant+" de antigüedad" ;
}
return msg;
}

Diseña una función que sea capaz de encontrar los caracteres comunes entre dos palabras. La función recibe como argumentos dos palabras o frases y devuelve una cadena con los caracteres que haya en común entre ambas ordenados de menor a mayor.
Se desechan los espacios en blanco.
No se tiene en cuenta el caso (mayúsuclas o minúsculas)
Por ejemplo si llamamos a la función comunes("Ciudad", "Cuidar") el resultado será "acdiu"

function comunes(pal1, pal2){
  let comunes = '', car;
  pal1 = pal1.toLowerCase();
  pal2 = pal2.toLowerCase();
  for(let i = 0; i< pal1.length;i++){
  car = pal1.charAt(i);
  if(pal2.includes(car) && !comunes.includes(car)){
    comunes += car;
  }
}
  comunes = comunes.split("")
  comunes.sort();
  comunes = comunes.join('');
  return comunes;
}

En este caso se trata de escriir una función javascript que acepte como argumento una cadena de caracteres y reúna los espacios repetidos en un solo espacio. Una especie de compresora de espacios. Resolverlo sin usar expresioens regulares ni arrays, solo el objeto string.
Por ejemplo tenemos la llamada unirEspacios("HTML       es      muy  fácil"), deberá devolver "HTML es my fácil"

function unirEspacios(frase){
 let cambiada='', i = 0;
 frase = frase.trim();
  //cada vez que encuentra un espacio
  //extrae la subcadena hasta ese punto y
  //continua buscando desde el siguiente caracter
  slatando los espacios repetidos
 while ( i >= 0){
  frase = frase.substring(i);
  i = frase.indexOf(" ");
  switch (true){
    case i>0:
      cambiada += frase.substring(0, i+1);
      i++;
      break;
    case i<0 :
      cambiada += frase;
      break
    case i==0:
      i++;
    }
  }
 return cambiada }

Crear una función que reciba como parámetro una lista de palabras separadas por coma. La función deberá agrupar las palabras que comienzan por la misma letra en objetos de la forma inicial: lista de palabras. No se debe distinguir entre mayúculas y minúsculas. Las palabras deben mantener su tipo de mayúsculas o minúsculas

Un ejemplo de uso podría ser:

agrupar("Avion, avispa, tigre, leon, Tejón, lince, abeja, abejorro"), resultado:

 {a: 'abeja, abejorro, Avion, avispa', l: 'leon, lince', t: 'Tejón, tigre'}

function agrupar(lista){
   let items, iniciales={}, inicial
   lista = lista.replaceAll(/\s/g,"");
   items = lista.split(',');
   //ordenar sin diferenciar mayúsculas
   items = items.sort(function(a,b){
             return (a.toLowerCase()) > b.toLowerCase())?1:-1
              })
   items.forEach(function(v){
      inicial = v.charAt(0).toLowerCase();
      if(!iniciales[inicial]){
          iniciales[inicial] = v;
      }
      else{
          iniciales[inicial] += ", "+v;
      }
   )
return iniciales;
}

Esta función que se pide va a recibir como argumento un texto con información. El texto es una cadena donde aparecen pares de la forma nombre dato: valor dato. La función debe convertir esta cadena en un objeto con campos identificados con nombre dato y valor dado por valor dato.
Ejemplo leeDato("nombre: juan, apellidos: Perez Sanchez, edad: 10, nivel: base") esto dará lugar al objeto
{nombre: "juan", apellidos:"Perez Sanchez", edad:10, nivel:"base"}

function leeDatos(lista){
    let items = lista.split(",");
    let res ={}, kv;

    for(let i=0; i < items.length; i++){
        kv = items[i].split(":");
        res[kv[0].trim()] = kv[1].trim();
    }
    return res;
}

Debes crear una función que reciba tres argumentos: una frase y dos palabras, como resultado la función insertará la segunda palabra detrás de la primera con un espacio por delante y por detrás. Si no se encuentra la palabra después de la que insertar se devuelve la frase original
Ppor ejemplo insertar("nombre:,edad 30:", "nombre", "Juan"), el resultado será la cadena"nombre: Juan, edad:30"

function insertar(frase, pal1, pal2){
  let pos, parte1, parte2, resdo;
  pal1 = pal1.trim();
  pos = frase.indexOf(pal1);
  resdo = frase;
  if (pos >=0){
    parte1 = frase.substring(0, pal1.length+pos);
    parte2 = frase.substring(pal1.length+pos);
    resdo = parte1.concat(pal2).concat(parte2)
  }
  return resdo;
}