我有一个创建对象并计算一些属性的小功能
function MyArrayObj(array) {
this.array = array;
this.sorted = (function (arr) { return arr.sort(function(a, b) { return a - b }) })([...this.array]);
this.max = this.sorted.slice(-1).pop();
this.min = this.sorted[0];
this.sum = this.sorted.reduce(function(a, b) { return a + b; }, 0);
this.unique = [...new Set(this.sorted)];
}
之所以这样做,是因为我希望在创建对象后就准备好一切。
但是我对this.sorted
有一个疑问:每次调用它的值都会被计算吗?创建对象时还是只有一次?
PS:我应该这样做吗?还是等到我真正需要max
,min
等,然后才获取值才更好?
答案 0 :(得分:1)
sorted
不是函数,而是调用值为function (arr) { return arr.sort(function(a, b) { return a - b }) }
的匿名函数[...this.array]
的结果。因此,它本身并不是要再次调用的函数。
PS:我应该这样做吗?还是等到我真正需要
max
,min
等,然后才获取值才更好?
这当然取决于您的应用程序。如果您可能不再需要它们,那么等待是有道理的。但是,如果您可能会需要它们中的任何一个,特别是如果您打算不止一次使用它们,那么,由于其中唯一昂贵的操作是sorted
(无论如何也要在其他一些中使用),您可能会好在前面做。这种方式的代码更加简洁。
但是说到干净的代码...如果您不需要此对象的原型(即,您没有向此类型添加方法),那么使用工厂函数创建它可能会更干净(因此跳过new
运算符。)这是一个版本:
const myArrayObj = (array, sorted = [... array].sort()) => ({
array,
sorted,
max: sorted[sorted.length - 1],
min: sorted[0],
sum: array.reduce((a, b) => a + b, 0),
unique: [... new Set(sorted)]
})
如果您不希望以这种方式定义sorted
,则可以这样做
const myArrayObj = (array) => {
const sorted = [... array].sort())
return {
array,
// ...
}
}
另外一点。如果您本身需要sorted
,就可以了。但是,如果您只想让sorted
得到max
和min
,那么执行O(n * log(n))
操作来获取可以在{{1 }} 那些。根据您的数据,这可能永远不会成为问题,但是值得考虑。