Каковы полезные методы JavaScript, которые расширяют встроенные объекты?
Каковы ваши самые полезные, наиболее практичные методы, которые расширяют встроенные объекты JavaScript, такие как String, Array, Date, Boolean, Math и т.д.?
Строка
Массив
Дата
Примечание. Пожалуйста, отправьте один расширенный метод за каждый ответ.
Ответы
Ответ 1
Строка Заменить все:
String.prototype.replaceAll = function(search, replace)
{
//if replace is not sent, return original string otherwise it will
//replace search string with 'undefined'.
if (replace === undefined) {
return this.toString();
}
return this.replace(new RegExp('[' + search + ']', 'g'), replace);
};
var str = 'ABCADRAE';
alert(str.replaceAll('A','X')); // output : XBCXDRXE
Ответ 2
Здесь другая реализация метода String.replaceAll()
String.prototype.replaceAll = function(search, replace) {
if (replace === undefined) {
return this.toString();
}
return this.split(search).join(replace);
}
Разница между этим и размещенным решением здесь заключается в том, что эта реализация обрабатывает правильные регулярные выражения специальных символов в строках, а также позволяет сопоставлять слова
Ответ 3
Array.prototype.indexOf = Array.prototype.indexOf || function (item) {
for (var i=0; i < this.length; i++) {
if(this[i] === item) return i;
}
return -1;
};
Использование:
var list = ["my", "array", "contents"];
alert(list.indexOf("contents")); // outputs 2
Ответ 4
Есть тонна функций String.prototype из Джеймса Падольси
https://github.com/padolsey/string.prototype
К ним относятся:
- camelize
- содержит
- Количество
- Вложите
- экстракт
- ForEach
- forEachWord
- linkify
- много
- Randomize
- удалить
- обратное
- укоротить
- рода
- toDOM
- отделка
- обертка
Ответ 5
string.Format
String.prototype.format = function (values) {
var regex = /\{([\w-]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?\}/g;
var getValue = function (key) {
if (values == null || typeof values === 'undefined') return null;
var value = values[key];
var type = typeof value;
return type === 'string' || type === 'number' ? value : null;
};
return this.replace(regex, function (match) {
//match will look like {sample-match}
//key will be 'sample-match';
var key = match.substr(1, match.length - 2);
var value = getValue(key);
return value != null ? value : match;
});
};
Использование:
alert('Program: {key1} {key2}'.format({ 'key1' : 'Hello', 'key2' : 'World' })); //alerts Program: hello world
Ответ 6
// left trim
String.prototype.ltrim = function () {
return this.replace(/^\s+/, '');
}
// right trim
String.prototype.rtrim = function () {
return this.replace(/\s+$/, '');
}
// left and right trim
String.prototype.trim = function () {
return this.ltrim().rtrim();
}
Ответ 7
Прокладка строк:
String.prototype.padLeft = function (length, character) {
return new Array(length - this.length + 1).join(character || ' ') + this;
}
'trial'.padLeft(7, 'X'); // output : 'XXtrial'
'trial'.padLeft(7); // output : ' trial'
String.prototype.padRight = function (length, character) {
return this + new Array(length - this.length + 1).join(character || ' ');
}
'trial'.padRight(7, 'X'); // output : 'trialXX'
'trial'.padRight(7); // output : 'trial '
Ответ 8
PHP.JS - очень приятное усилие для переноса большинства функций PHP на JavaScript. В настоящее время у них очень впечатляющий список:
В сети: http://phpjs.org/functions/index
Ответ 9
Function.prototype.bind из библиотеки Prototype.
Аналогично call
и apply
, но позволяет вам возвращать ссылку на функцию, вызываемую в определенном контексте, вместо того, чтобы немедленно ее выполнять. Также позволяет выполнять карри параметры. Он настолько полезен, что стал частью ECMAScript 5 и уже реализуется изначально в браузерах.
Function.prototype.bind = function() {
var __method = this, args = Array.prototype.slice.call(arguments), object = args.shift();
return function() {
var local_args = args.concat(Array.prototype.slice.call(arguments));
if (this !== window) local_args.push(this);
return __method.apply(object, local_args);
}
}
Ответ 10
Различные прототипы обработки списка всегда велики. Поскольку вы хотите только один за сообщение, я просто отправлю foldl
, который я обнаружил через SML (он "сворачивает" список, слева направо, он имеет счетчик в foldr
, конечно).
Array.prototype.foldl = function(fnc,start) {
var a = start;
for (var i = 0; i < this.length; i++) {
a = fnc(this[i],a);
}
return a;
}
Некоторые тривиальные примеры могут быть:
var l = ["hello" , "world"];
l.foldl(function(i, acc) { return acc+" "+i; }, "") // => returns "hello world"
К сожалению, отказ стандартных DOM-методов от возврата истинных массивов делает многие из этих методов более бесполезными. И если вы используете какой-либо Lib, они часто определяют такие методы, как эти (map, filter, exists и т.д.).
Ответ 11
Date.toMidnight
Date.prototype.toMidnight = function(){
this.setMinutes(0);
this.setSeconds(0);
this.setHours(0)
}
Ответ 12
Массив содержит:
Array.prototype.contains = function(obj) {
for (var i=0; i < this.length; i++) {
if(this[i] === obj) return i;
}
return -1;
}
Использование:
var arr = [1, 2, 3];
alert(arr.contains(2));
Эта небольшая вспомогательная функция сообщает вам, содержит ли ваш массив объект. Если это так, возвращается индекс объекта, в противном случае возвращается -1.
Бесплатный совет в пятницу: никогда не изменяйте прототип объекта. Это было бы просто попросить целый мир боли - я усвоил это с трудом:)
Ответ 13
Здесь хорошее расширение для объекта Date, которое позволяет вам легко форматировать дату. Он использует синтаксис даты PHP, поэтому знакомые с PHP получат его в кратчайшие сроки. У других также есть огромный список возможных переключателей на сайте. Лично я не нашел более простой способ отформатировать даты в различных форматах.
Формат даты
Ответ 14
Множество функций, которые я использую много, можно найти здесь:
http://svn.asplib.org/asplib1.2/core/string.asp
http://docs.hyperweb.no/objects/String/
Ответ 15
Я использовал функцию Array.Map, описанную Скоттом Кунем пару раз.
http://www.lazycoder.com/weblog/2009/08/12/a-simple-map-function-for-plain-javascript-arrays/
Array.prototype.map = function(fn) {
var r = [];
var l = this.length;
for(i=0;i<l;i++)
{
r.push(fn(this[i]));
}
return r;
};
Ответ 16
Эти два являются оболочками для вставки и удаления элементов из определенной позиции в массиве, потому что мне не нравится имя splice
.
// insert element at index
Array.prototype.insertAt = function(element, index) {
this.splice(index, 0, element);
}
// delete element from index
Array.prototype.removeAt = function(index) {
this.splice(index, 1);
}
Еще несколько полезных методов Array, чтобы уйти от использования индексов:
Array.prototype.first = function() {
return this[0] || undefined;
};
Array.prototype.last = function() {
if(this.length > 0) {
return this[this.length - 1];
}
return undefined;
};
Array.prototype.max = function(array){
return Math.max.apply(Math, array);
};
Array.prototype.min = function(array){
return Math.min.apply(Math, array);
};
Некоторые полезные функции из библиотеки MooTools:
Function.delay
Используется для выполнения функции по истечении заданных миллисекунд.
// alerts "hello" after 2 seconds.
(function() {
alert("hello");
}).delay(2000);
Number.times
Подобно методу Ruby times для чисел, он принимает функцию и выполняет ее N раз, где N - это числовое значение.
// logs hello 5 times
(5).times(function() {
console.log("hello");
});
Ответ 17
Используйте цепочку прототипов следующим образом:
String.prototype.AddWorld = function() { return this+'World' }
"Hello ".AddWorld(); // returns the string "Hello World"
Ответ 18
// This replaces all instances of 'from' to 'to' even when
// 'from' and 'to' are similar (i.e .replaceAll('a', 'a '))
String.prototype.replaceAll = function(from, to) {
var k = this;
var i = 0;
var j = from.length;
var l = to.length;
while (i <= k.length)
if (k.substring(i, i + j) == from) {
k = k.substring(0, i) + k.substring(i).replace(from, to);
i += l;
}
else
i++;
return k;
};
Ответ 19
Есть хорошая статья в http://maiaco.com/articles/js/missingArrayFunctions.php, описывающая шесть полезных функций для добавления в прототип Array. Функции linearSearch (такие же, как indexOf, заданные в другом ответе), binarySearch, retainAll, removeAll, unique и addAll. В статье также содержится код JavaScript для каждой из шести функций и пример кода, показывающий, как их использовать.
Ответ 20
Это прототип функции для заглавной строки:
String.prototype.capitalize = function() {
return this.charAt(0).toUpperCase() + this.slice(1);
}
Ответ 21
Используйте что-то вроде underscore.js или для Angular используйте lodash.