【问题标题】:Reverse Array, Let Elements in New Array Equal Length of Original Array Elements - JavaScript反转数组,让新数组中的元素与原始数组元素等长 - JavaScript
【发布时间】:2019-10-05 20:32:11
【问题描述】:

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

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

【问题讨论】:

    标签: javascript arrays reverse string-length


    【解决方案1】:

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

    !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!"]));

    【讨论】:

    • 感谢@CertainPerformance - 它确实有效。你能解释一下第 2 行的{length} - 在这种情况下,长度是一个对象吗?
    • 那是解构。参数列表中的{ propName } 从参数列表中该位置的项目中提取名为propName 的属性,并将其放入名为propName 的变量中。字符串的.length 是一个整数。
    • 请解释为什么需要括号包裹{ length }。否则error: unknown: Unexpected token, expected ","
    • @sandthorn 我认为这是因为解析器将不带括号的{ length } 视为对象,然后当它看到对象后面的=&gt; 时窒息。不完全确定,我会调查一下。如果我没有看到一个好的答案,我可能会在弄清楚发生了什么后自己写一个 Q+A
    • 一些解释here
    【解决方案2】:

    您还可以通过重设字符串然后映射它并使用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 长度一样多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多