【发布时间】:2016-04-22 04:33:46
【问题描述】:
假设你有一个班级Person。它的定义如下:
function Person(name, age) {
this.name = name;
this.age = age;
}
现在假设您有一组Persons(或人),并且您想找到最旧的。在 C# 中,您可以通过扩展方法来做到这一点:
Person Oldest(this IEnumerable<Person> people) =>
people.OrderByDescending(p => p.Age).First();
// Usage:
var elder = people.Oldest();
JavaScript 中的等价物是什么?到目前为止,这就是我能想到的:
Array.prototype.oldest = function() {
return this.slice().sort(function(left, right) {
return left.age - right.age;
}).pop();
};
这很好用,语法与 C# 相同,但有一些缺点:
1) 它修改了内置函数的原型,这可能会导致与这样做的其他库发生冲突。
2) 它不是类型安全的:很容易意外调用不包含人员的数组,这可能导致运行时错误。
或者,您可以这样定义它:
function oldest(people) {
// ...
}
但是您必须将其称为 oldest(people) 而不是 people.oldest(),这会妨碍可读性。
在我缺少的 JavaScript 中是否有任何类型安全、语法上“不错”的方法?
【问题讨论】:
-
我会使用
oldest(people)并返回最旧的 Person,既简单又安全,而且在我看来比将新属性分配给内置函数更具可读性 -
对于最旧的,不需要排序,只需要遍历,返回最大值的集合即可。
-
排序为
n log n。 argmax 可以线性完成。只需从头到尾迭代即可。
标签: javascript arrays prototype extension-methods type-safety