当我尝试使用注释代码(多行 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 语句?
您可以将拆分后的字符串与匹配值作为索引进行映射。
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
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"));