代码之家  ›  专栏  ›  技术社区  ›  HappyHands31

反向数组,让新数组中的元素等于原始数组元素的长度-JavaScript

  •  3
  • HappyHands31  · 技术社区  · 5 年前

    试图解决 this kata on 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
    

    现在,如果我可以根据原始元素的长度将字符串拆分为数组中的元素。。。

    1 回复  |  直到 5 年前
        1
  •  10
  •   CertainPerformance    5 年前

    首先构造完全反转的字符串,例如

    !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!"]));
        2
  •  1
  •   Akrion    5 年前

    你也可以通过对字符串进行重新排序,然后映射到字符串中,然后使用 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!"]))

    基本上通过原始数组和每个字符串进行映射 子序列 与当前x长度相等的组合反转字符串。