Обратный массив, пусть элементы в новом массиве равны длине оригинальных элементов массива - JavaScript - PullRequest
11 голосов
/ 19 мая 2019

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

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

function ultimateReverse (array) {

 let newArray = array.join("").split("");
 let reversedArray = newArray.reverse();
 return reversedArray.join("");

}

console.log(ultimateReverse(["I", "like", "big", "butts", "and", "I", "cannot", "lie!"]));

//!eiltonnacIdnasttubgibekilI

Но результат, который мы хотим получить:

["!", "eilt", "onn", "acIdn", "ast", "t", "ubgibe", "kilI"]

Таким образом, согласно исходному массиву длина первого элемента должна быть1, длина второго элемента должна быть 4, третий должен быть длиной 3 и т. Д. ...

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

Я думал о создании массива длин элементов из исходного массива, выполнив:

function ultimateReverse (array) {

let elementLengths = [];

let newArray = array.join("").split("");
let reversedArray = newArray.reverse().join("");

for (let i = 0; i < array.length; i++) {
  let element = array[i];
  elementLengths.push(element.length);
}

return reversedArray + " " + elementLengths;

}

console.log(ultimateReverse(["I", "like", "big", "butts", "and", "I", "cannot", "lie!"]));

//!eiltonnacIdnasttubgibekilI 1,4,3,5,3,1,6,4

Теперь, если я могу просто разбить строку на элементы в массиве на основедлина оригинальных элементов ...

Ответы [ 2 ]

10 голосов
/ 19 мая 2019

Сначала создайте полную обратную строку, например,

!eiltonnacIdnasttubgibekilI

Затем из массива начальных длин (что можно сделать с помощью .map заранее) выполните итерацию по этому массиву и slice по этой длине из обращенной строки и нажмите в массив:

function ultimateReverse(array) {
  const lengths = array.map(({ length }) => length);
  let reversedStr = [...array.join("")].reverse().join('');
  const result = [];
  lengths.forEach((length) => {
    result.push(reversedStr.slice(0, length));
    reversedStr = reversedStr.slice(length);
  });
  return result;
}

console.log(ultimateReverse(["I", "like", "big", "butts", "and", "I", "cannot", "lie!"]));

Вы также можете сохранить исходные обращенные данные в виде массива, из которого вы splice, вместо переназначения reversedStr:

function ultimateReverse(array) {
  const lengths = array.map(({ length }) => length);
  const reversedChars = [...array.join('')].reverse();
  return lengths.map(
    length => reversedChars.splice(0, length).join('')
  );
}

console.log(ultimateReverse(["I", "like", "big", "butts", "and", "I", "cannot", "lie!"]));
1 голос
/ 19 мая 2019

Вы также можете решить эту проблему, перевернув строку, затем отобразив ее и, по сути, «разрезав ее на части» с помощью substr, например:

let reverse = arr => {	
  let i = 0, rData = [...arr.join('')].reverse().join('')
  return arr.map(x => {
    let str = rData.substr(i, x.length)
    i += x.length 
    return str
  })
}

console.log(reverse(["I", "like", "big", "butts", "and", "I", "cannot", "lie!"]))

В основном отображает исходный массив и для каждой строки substr из объединенной обратной строки, равной текущей длине x.

...