Scramble String в соответствии с массивом значений - Javascript - PullRequest
5 голосов
/ 04 июня 2019

Пытаясь решить этот вопрос на Codewars.

Я видел другие статьи , которые касаются случайного перемешивания / перемешивания строки.

Но как насчет шифрования строки в соответствии со значениями в данном массиве?

т.е. abcd с учетом массива [0, 3, 2, 1] станет acdb, потому что:

  • a перемещается в индекс 0
  • b перемещается в индекс 3
  • c перемещается в индекс 2
  • d перемещается в индекс 1

Я предполагаю начать с разбиения строки на массив. И затем мы хотим получить значение индекса массива, переданного в функцию scramble, и вставить символ со значением индекса из этого массива в новый массив. И, наконец, присоединиться к массиву:

function scramble(str, arr) {

  let newArray = str.split("");
  let finalArray = [];

  for (let i = 0; i < str.length; i++) {
    console.log(newArray);
    finalArray.push(newArray.splice(arr[i], 1));
  }
  return finalArray;
}

console.log(scramble("abcd", [0, 3, 1, 2]));

Но проблема этой логики в том, что .splice() удаляет символ из newArray каждый раз.

Есть ли другой метод, который удалит символ по указанному индексу без изменения исходного массива?

Не думаю, что ломтик тоже будет работать.

Ответы [ 4 ]

3 голосов
/ 04 июня 2019

Вы можете создать отдельный массив для хранения букв.

var str = "abcd";
var arr = [0, 3, 2, 1];
function scramble(s, a) {
    var ar = Array(a.length);
    a.forEach((e, i) => {
        ar[e] = s[i];
    });
    return ar.join('');
}
console.log(scramble(str, arr));
2 голосов
/ 04 июня 2019

Ответ

Используйте reduce для массива, и, поскольку массив повторяется, присвойте символ индекса итератора (i) в строке (s) индексу значения (v) нового массива ( ra). После завершения reduce используйте join, чтобы превратить возвращенный массив (ra) обратно в строку.

let scramble = (s, a) => a.reduce((ra,v,i)=> (ra[v] = s[i], ra), []).join("");

Пример:

let scramble = (s, a) => a.reduce((ra,v,i)=> (ra[v] = s[i], ra), []).join("");

console.log( scramble("abcd", [0,3,2,1]) );

Уточняющий код:

Я понимаю, что приведенный выше код может быть трудно обернуть вокруг. Позвольте мне предоставить вам такую ​​же точную функциональность, но в стандартной функции. Имейте в виду, что это точно , что происходит в приведенном выше коде, но может быть проще понять, если вы не привыкли к краткости ES6:

function scramble(my_string, my_array) { 
   // create an array to return
   let returnable_array = [];

   // loop through the provided array. 
   // string index is the array key: 0,1,2,3
   // array_index is the value of the array keys: 0,3,2,1

   for(let [string_index, array_index] of my_array.entries()) {

   // we assign the character at string index 
   // to the value index inside the returnable array

    returnable_array[array_index] = my_string[string_index];
   } 

   // we turn the array into a string
   let returnable_string = returnable_array.join("");

   // we return the string
   return returnable_string
}

* +1032 * Пример: * 1 033 *

    function scramble(my_string, my_array) { 
       let returnable_array = [];
       for(let [string_index, array_index] of my_array.entries()) {
        returnable_array[array_index] = my_string[string_index];
       } 
       returnable_string = returnable_array.join("");
       return returnable_string
    }


console.log(scramble("abcd", [0,3,1,2]));
1 голос
/ 04 июня 2019

Я думаю, что наилучшим подходом было бы поместить строку в новый массив:

    function scramble(str, arr) {
        //validate if the array has elements
        if (arr && arr.length) {
            //create a new array
            const strArr = []
            arr.forEach(index => {
                //push each character by index
                //As noted by Barmar you could either use
                //str.charAt(index) or str[index]
                //as both will return the character at the specified index
                strArr.push(str.charAt(index))
            })
            //return a new string
            return strArr.join('');
        }
    }
1 голос
/ 04 июня 2019

Вы можете зациклить входную строку, получить символ в текущей позиции с помощью string.charAt (position) и поместить его в новый массив в позицию, полученную из массива положений.

function scramble (str, arr) {
let newArray = [];
for (let i = 0; i < str.length; i++) {
    newArray[arr[i]]=str.charAt(i);
  }
  return newArray.join();
}

console.log(scramble("abcd", [0, 3, 1, 2]));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...