并发数组函数

Concurrent Array Functions

我有一个函数,它接受一个包含数字字符串的子数组数组和 returns 每个子数组中具有最大数字的数组:

const largestOfFour = arr => {
            arr.map(e => {
                e.sort((a,b) => b - a).splice(1);
            });
            return arr.flat();
        } 

它按照上面的格式化方式工作得很好,但是如果用传入的数组上的并发函数格式化它就不起作用了。像这样:

const largestOfFour = arr => {
            return arr.map(e => {
                e.sort((a,b) => b - a).splice(1);
            }).flat();
        }

在该格式中,它 returns 一个适当长度的数组,但每个元素都是空的。谁能帮我理解这是为什么?我通常不会遇到将并发函数链接到数组上的问题。

内部块(在地图中)未返回任何内容,导致未定义数组。已在代码段中修复...

let a = [
  ["1", "2", "3"],
  ["4", "5", "6"]
]

const largestOfFour = arr => {
  return arr.map(e => {
    return e.sort((a, b) => b - a)[0];
  }).flat();
}

console.log(largestOfFour(a))

JavaScript 中没有并发。但是你的 map 回调没有 return 任何东西(语句块中没有 return)所以 .map() return 是一个未定义值的数组。

为了避免原始数据发生变异,我也会避免在原始数组上使用 sort,并使用 slice 而不是 splice

但是因为你只需要每个数组中的一个值,你甚至不需要slice:只需要获取索引0处的值(使flat 不必要):

let a = [
  ["1", "2", "3"],
  ["4", "5", "6"]
];

const largestOfFour = arr =>
  arr.map(e =>
    [...e].sort((a, b) => b - a)[0]
  );

console.log(largestOfFour(a));

或者更好,只需使用 Math.max,这也可以转换为数字:

let a = [
  ["1", "2", "3"],
  ["4", "5", "6"]
];

const largestOfFour = arr => arr.map(e => Math.max(...e));

console.log(largestOfFour(a));