单行 reduce 语句不起作用 - 如何修复

问题描述 投票:0回答:2

当我尝试使用注释代码(多行 reduce 语句)时它工作正常。 但是,当我尝试使用单行 reduce 语句时,它不起作用。 我理解这是由于 reduce 语句中的 splice 命令。 谁能建议如何克服这种情况以在单行中编写 reduce 语句?

function order(words){
    // ...
    let regex = /\d+/g;
    let matches = words.match(regex)

    // return words.split(' ').reduce((finalar, element, indx) => {
    //     console.log('matches', matches);
    //     finalar.splice(matches[indx] - 1, 0, element)
    //     console.log('element', element);
    //     return finalar;
    // }, []).join(' ');
    return words.split(' ').reduce((finalar, element, indx) => finalar.splice([matches[indx] - 1],0,element) , []);
}

console.log(order("is2 Thi1s T4est 3a"));  //Output: Thi1s is2 3a T4est

当我尝试使用注释代码(多行 reduce 语句)时它工作正常。 但是,当我尝试使用单行 reduce 语句时,它不起作用。 我理解这是由于 reduce 语句中的 splice 命令。 谁能建议如何克服这种情况以在单行中编写 reduce 语句?

javascript node.js reduce
2个回答
1
投票

您可以将拆分后的字符串与匹配值作为索引进行映射。

function order(words) {
    const
        regex = /\d+/g,
        matches = words.match(regex);

    return words
        .split(' ')
        .map((_, i, a) => a[matches[i] - 1])
        .join(' ');
}

console.log(order("is2 Thi1s T4est 3a")); //Output: Thi1s is2 3a T4est


0
投票

您的 one-liner 代码不起作用的原因是

Array#splice
方法返回已删除的元素,而不是修改后的数组。因此,您的代码返回的是已删除元素的数组,而不是最终排序的数组。

为了解决这个问题,您可以在

Array#reduce
中的箭头函数中添加一个return 语句,以在每次迭代后返回
finalar
数组。

function order(words){
  let regex = /\d+/g;
  let matches = words.match(regex)
  return words.split(' ').reduce((finalar, element, indx) => {
      finalar.splice(matches[indx] - 1, 0, element)
      return finalar;
  }, []).join(' ');
}

console.log(order("is2 Thi1s T4est 3a"));

您也可以删除

matches[indx] - 1
周围的方括号,因为它们不是必需的。
Array#splice
方法期望索引作为第二个参数传递,而不是作为数组传递。

function order(words){
  let regex = /\d+/g;
  let matches = words.match(regex)
  return words.split(' ').reduce((finalar, element, indx) => finalar.splice(matches[indx] - 1, 0, element) && finalar, []).join(' ');
}

console.log(order("is2 Thi1s T4est 3a"));

另一种使用

Array#map
的方法,我们创建一个新的元组数组,其中每个元组包含单词及其对应的数字。然后,您可以根据数字对数组进行排序并将单词提取到一个新数组中。

function order(words) {
  const regex = /\d+/g;
  const tuples = words.split(' ').map((word) => [word, parseInt(word.match(regex))]);
  const sortedTuples = tuples.sort((a, b) => a[1] - b[1]);
  const sortedWords = sortedTuples.map((tuple) => tuple[0]);
  return sortedWords.join(' ');
}

console.log(order("is2 Thi1s T4est 3a"));

© www.soinside.com 2019 - 2024. All rights reserved.