使用js-reduce方法.只是风格问题



我正在使用js,并试图决定代码的风格。

我需要在人物集合中找到最年轻的人的年龄。我的问题是:如果数组为空,我应该返回undefined吗?如果数组为空,我应该让它失败吗?

这就是我所做的:


let people = [{name: "a", age: 20}, {name: "b", age: 21}]
function nameOfYoungestPerson(people) {
let yst = youngest(people)

return yst && yst.name
}
function youngest(people) {
return people.reduce((yst, person) => yst === undefined ? person : 
(person.age < yst.age ? person : yst), undefined)
}

另一种选择是让它失败:


function youngest(people) {
return people.reduce((yst, person) => person.age < yst.age ? person : yst) 
}

还有,哪个更好:


function youngest(people) {
return people.reduce((yst, person) => yst === undefined ? person : 
(person.age < yst.age ? person : yst), undefined)
}

或者:


function youngest(people) {
return empty(people) ? undefined : people.reduce((yst, person) => 
person.age < yst.age ? person : yst)
}

让它失败。调用者有责任确保参数有效,如果参数无效,最好尽快通知调用者。如果返回undefined,调用程序将继续运行,并且一旦您实际尝试使用未定义的值执行某些操作,程序将在很久以后失败。到那时,你可能很难弄清楚这个未定义的值是从哪里来的。

当然,写一个不会崩溃的函数会更好。然而,问题是,如果数组是空的,那么实际上就没有任何有用的值可以返回。null和undefined可能只是将崩溃推迟到以后。当然,除非调用方检查未定义的返回值,但与只让调用方检查数组是否为空相比,有什么优势?没有。

在您展示的两个变体中,第二个变体更好,因为每个循环迭代只计算一个条件。第一个将在每次迭代中评估两个条件,从而降低效率。

我不会"让它失败";,但是,如果你100%知道数组中总是有人,你就可以不为它构建案例。

不过,以一种方式添加来处理空数组是很容易的,所以我可能只会这么做。我建议不要返回undefined,因为这可能会导致混乱,而是返回null,因为如果对象上不存在名称,它也可能返回undefine,这会导致意外行为。

对于你关于如何设计风格的问题,我建议在单独的一行上处理这个空案例,因为你的单行解决方案很长,很难快速阅读imho。

function youngest(people) {
if (!people.length) return null;
return people.reduce((yst, person) => person.age < yst.age ? person : yst) 
}

最新更新