问题:
如何编写自定义Array.prototype.find()
而不将其添加到Array.prototype?我想保留原始代码尽可能接近原始代码
为什么吗 我听说将polyfill放在Array.prototype上是不好的做法。
我使用过Array.prototype.find()
,我在ios9 mobile上遇到了问题。
this.currentModalInfo = this.langDataService.transformedData
.find(function(obj) {
if (obj.docs.language_code === routeParam) {
return obj;
}
});
我在mdn上发现了一个polyfill:
if (!Array.prototype.find) {
Array.prototype.find = function(predicate) {
if (this === null) {
throw new TypeError('Array.prototype.find called on null or undefined');
}
if (typeof predicate !== 'function') {
throw new TypeError('predicate must be a function');
}
var list = Object(this);
var length = list.length >>> 0;
var thisArg = arguments[1];
var value;
for (var i = 0; i < length; i++) {
value = list[i];
if (predicate.call(thisArg, value, i, list)) {
return value;
}
}
return undefined;
};
}
答案 0 :(得分:3)
只需使用函数的参数替换polyfill中this
的使用:
function findIn(array, predicate) {
if (array === null) {
throw new TypeError('findIn called on null or undefined');
}
if (typeof predicate !== 'function') {
throw new TypeError('predicate must be a function');
}
var list = Object(array);
var length = list.length >>> 0;
var thisArg = arguments[2];
var value;
for (var i = 0; i < length; i++) {
value = list[i];
if (predicate.call(thisArg, value, i, list)) {
return value;
}
}
return undefined;
}
然后你的函数调用变为:
this.currentModalInfo = findIn(this.langDataService.transformData, function(obj) {
return obj.docs.language_code === routeParam;
});