我试图在数字数组上使用 .filter、.sort 和 .reduce 以返回由逗号和空格分隔的字符串

Posted

技术标签:

【中文标题】我试图在数字数组上使用 .filter、.sort 和 .reduce 以返回由逗号和空格分隔的字符串【英文标题】:Im trying to use .filter, .sort, and .reduce on an array of numbers to return a string separated by a comma and a space 【发布时间】:2022-01-04 16:57:03 【问题描述】:

我应该编写一个函数,它接受一个数字数组并返回一个字符串。该函数应该使用过滤器、排序和归约来返回一个仅包含奇数的字符串,并以逗号分隔升序。

我似乎无法让我的 .reduce 方法实际返回任何内容,并且我的 if 条件似乎无法正常工作......(例如,它在最后一个数字的输出之后添加了一个逗号和空格,例如这个“3, 17,”)

这是我目前编写的代码...

const numSelectString = (numArr) => 
    // use .filter to select only the odd numbers
  numArr.filter((num) => num % 2 !== 0)
  // use. sort to sort the numbers in ascending order
  .sort((a,b) => a-b)
  // use reduce to create the string and put the commas and spaces in
  .reduce((acc, next, index) => 
    
    if (index+1!==undefined) 
      return acc = acc + next + ', ';;
     else 
      return acc + next;
    
  ,'')


const nums = [17, 34, 3, 12]
console.log(numSelectString(nums)) // should log "3, 17"

有人有时间帮我整理一下reduce方法吗?我试图传入索引以确定reduce是否在最后一个元素上进行迭代以不输出最后一个元素之后的“,”......但还没有让它工作......另外,我还是不明白为什么我的输出总是“未定义”!

感谢您的帮助!

【问题讨论】:

index+1!==undefined 将始终为 true,因为数字始终为 !== undefined 在numSelectString中至少需要一个return语句。 return numArr.filter... 为什么.reduce() 调用试图模仿.join(", ") 会做什么? 一旦你有了奇数,你就不需要使用.reduce() - 有这么多的迭代来得到字符串;只需使用.join(', ') 【参考方案1】:

您可以将检查替换为仅进行加法并且没有起始值。

const
    numSelectString = numArr => numArr
        .filter((num) => num % 2 !== 0)
        .sort((a, b) => a - b)
        .reduce(
            (acc, next, index) => index
                ? acc + ', ' + next
                : next,
            ''
        );

console.log(numSelectString([17, 34, 3, 12]));
console.log(numSelectString([2, 4, 6]));
console.log(numSelectString([1, 2]));

【讨论】:

或者...只需使用.join(", ") 而不是.reduce() o.O @Andreas,是的,但这不是reduce 我认为他不被“允许”(或者他不想)使用join,否则我同意,那会更容易【参考方案2】:

不要使用index+1!==undefined,试试这个

const numSelectString = (numArr) => 

  const numArrLength = numArr.length;
  const arr = [...numArr];

  arr
    .filter((num) => num % 2 !== 0)
    .sort((a,b) => a - b)
    .reduce((acc, next, index) => 
       if (index < numArrLength - 1) return acc += `$next, `;
       else return acc + `$next`;
    , "")

return arr;

不改变参数也被认为是一种好习惯。

另一种方法

使用.join() 方法很容易。

const numSelectString = (numArr) => 

const arr = [...numArr]
  arr
    .filter((num) => num % 2 !== 0)
    .sort((a,b) => a-b)
    .join(", ");

return arr;

【讨论】:

以上是关于我试图在数字数组上使用 .filter、.sort 和 .reduce 以返回由逗号和空格分隔的字符串的主要内容,如果未能解决你的问题,请参考以下文章

C++ 使用 std::sort 处理多维字符串数组

数组排序sort()

常用数组API forEach every some sort map filter slice indexOf

Python 函数式编程(map reduce filter sorted)

js sort() 数字排序 不太理解

JavaScript数字数组怎么按数字大小排序?