Иногда сталкивается с такими требованиями, и вам необходимо удалить дубликаты элементов в массиве и сохранить только один. Первый метод, который приходит на ум, - это, вероятно, использовать 2 для петель для сравнения и удаления дублирующих элементов. Код заключается в следующем:
Метод 1:
Кода -копия выглядит следующим образом:
Array.prototype.distinct = function () {
var arr = [],
len = this.length;
для (var i = 0; i <len; i ++) {
for (var j = i+1; j <len; j ++) {
if (this [i] === Это [j]) {
j = ++ i;
}
}
arr.push (это [i]);
}
возврат Arr;
};
Метод использования 1 Если вы сталкиваетесь с большим количеством данных, ваша производительность будет намного хуже. Затем, пожалуйста, продолжайте видеть следующий метод.
Метод 2:
Кода -копия выглядит следующим образом:
Array.prototype.distinct = function () {
var self = это,
arr = self.concat (). sort (); // Создать новый массив и сортировать его
arr.sort (function (a, b) {
if (a === b) {
var n = self.indexof (a); // Получить значение индекса
self.splice (n, 1);
}
});
вернуть себя;
};
Метод 2 использует пользовательскую функцию обратного вызова внедрения, а также использует IndexOF, метод, который не поддерживается IE6/7/8. Конечно, индекс может быть смоделирован сам по себе, но большая проблема заключается в том, что существует также разница между методом вида IE6/7/8 и стандартным браузером. Есть много ловушек в пользовательских функциях обратного вызова, которые используют метод сортировки в IE6/7/8. Код вышеупомянутой функции Custom Sort Callback будет напрямую сообщать об ошибке «отсутствующий номер» в IE6/7/8. Если функция обратного вызова возвращает NAN, сообщается об этой ошибке, потому что в теории функция обратного вызова сортировки может вернуть только целые числа. Даже если возвращаемое значение игнорируется, есть еще другие проблемы, и, в конце концов, проблем нет. Метод 2 не будет работать в IE6/7/8.
От причала дурака, вот его код:
Кода -копия выглядит следующим образом:
Array.prototype.delrepeat = function () {
var newarray = [];
var provisionaltable = {};
for (var i = 0, item; (item = this [i])! = null; i ++) {
if (! provisionaltable [item]) {
newarray.push (item);
provisionaltable [item] = true;
}
}
вернуть Ньюаррея;
};
Метод 3 использует временный объект для хранения элементов массива. Если вы столкнетесь с дублирующими элементами массива, это будет проигнорировано. Однако, если вы столкнетесь с следующим массивом:
Кода -копия выглядит следующим образом:
var arr = ['firefox', 1, '1'];
Если приведенный выше массив используется в методе 3, он ошибочно удалит 1 и «1» в качестве дублирующих элементов, поэтому можно решить небольшую модификацию метода 3.
Модифицированная версия метода 3:
Кода -копия выглядит следующим образом:
Array.prototype.distinct = function () {
var arr = [],
obj = {},
i = 0,
len = this.length,
результат;
for (; i <len; i ++) {
result = this [i];
if (obj [result]! == result) {
arr.push (результат);
obj [результат] = результат;
}
}
возврат Arr;
};
Позже я прочитал комментарии в конце статьи о дураках Wharf. Этот метод такой же, как и метод, предоставляемый Rekey, но этот метод также имеет ошибки. Если вы столкнетесь с таким массивом 2b, все будет в порядке:
Кода -копия выглядит следующим образом:
var arr = ['firefox', 1, '1', 1];
Приведенный выше массив изменен с помощью метода 3, а последние 3 элемента не будут удалены. Однако этот вид массива немного экстремальный. Если вы сталкиваетесь с данными с тем же буквальным размером и количеством строк, вам следует обработать заранее, чтобы избежать этой ошибки. Метод использования временных объектов немного быстрее, чем сортировка в стандартных браузерах, а алгоритмы метода вида также должны отличаться в каждом браузере.