Функция jQuery для получения всех уникальных элементов из массива?
jQuery.unique позволяет получать уникальные элементы массива, но в документах говорится, что эта функция в основном предназначена для внутреннего использования и работает только с элементами DOM. В другом ответе SO говорилось, что функция unique()
работает с числами, но этот вариант использования не обязательно является будущим доказательством, поскольку в документах это явно не указано.
Учитывая это, существует ли "стандартная" функция jQuery для доступа только к уникальным значениям - в частности, к примитивам, таким как целые числа - в массиве? (Очевидно, что мы можем построить цикл с помощью функции each()
, но мы новичок в jQuery и хотели бы знать, есть ли для этого выделенная функция jQuery.)
Ответы
Ответ 1
Вы можете использовать array.filter
для возврата первого элемента каждого отдельного значения -
var a = [ 1, 5, 1, 6, 4, 5, 2, 5, 4, 3, 1, 2, 6, 6, 3, 3, 2, 4 ];
var unique = a.filter(function(itm, i, a) {
return i == a.indexOf(itm);
});
console.log(unique);
Ответ 2
Просто используйте этот код в качестве основы для простого плагина JQuery.
$.extend({
distinct : function(anArray) {
var result = [];
$.each(anArray, function(i,v){
if ($.inArray(v, result) == -1) result.push(v);
});
return result;
}
});
Использовать так:
$.distinct([0,1,2,2,3]);
Ответ 3
На основе ответа @kennebec, но исправленного для IE8 и ниже, используя обертки jQuery вокруг массива, чтобы предоставить отсутствующие функции массива filter
и indexOf
:
$. makeArray() может не быть абсолютно необходимым, но вы получите нечетные результаты, если вы опустите эту оболочку и JSON.stringify в противном случае.
var a = [1,5,1,6,4,5,2,5,4,3,1,2,6,6,3,3,2,4];
// note: jQuery filter params are opposite of javascript native implementation :(
var unique = $.makeArray($(a).filter(function(i,itm){
// note: 'index', not 'indexOf'
return i == $(a).index(itm);
}));
// unique: [1, 5, 6, 4, 2, 3]
Ответ 4
Я бы использовал underscore.js, который предоставляет метод uniq
, который делает то, что вы хотите.
Ответ 5
// for numbers
a = [1,3,2,4,5,6,7,8, 1,1,4,5,6]
$.unique(a)
[7, 6, 1, 8, 3, 2, 5, 4]
// for string
a = ["a", "a", "b"]
$.unique(a)
["b", "a"]
И для элементов dom нет примера, который здесь нужен, я думаю, потому что вы уже знаете это!
Вот ссылка jsfiddle живого примера:
http://jsfiddle.net/3BtMc/4/
Ответ 6
Пройдите массив и нажимайте элементы в хеш, когда вы сталкиваетесь с ними. Перекрестная ссылка на хэш для каждого нового элемента.
Обратите внимание, что это будет ТОЛЬКО корректно работать для примитивов (строки, числа, нуль, undefined, NaN) и несколько объектов, которые сериализуются в одно и то же (функции, строки, даты, возможно, массивы в зависимости от содержимого). Хэши в этом будут сталкиваться, поскольку они все сериализуются в одно и то же, например. "[object Object]"
Array.prototype.distinct = function(){
var map = {}, out = [];
for(var i=0, l=this.length; i<l; i++){
if(map[this[i]]){ continue; }
out.push(this[i]);
map[this[i]] = 1;
}
return out;
}
Также нет причин, по которым вы не можете использовать jQuery.unique. Единственное, что мне не нравится в этом, это то, что он уничтожает порядок вашего массива. Вот точный код для него, если вам интересно:
Sizzle.uniqueSort = function(results){
if ( sortOrder ) {
hasDuplicate = baseHasDuplicate;
results.sort(sortOrder);
if ( hasDuplicate ) {
for ( var i = 1; i < results.length; i++ ) {
if ( results[i] === results[i-1] ) {
results.splice(i--, 1);
}
}
}
}
return results;
};
Ответ 7
У Paul Irish есть метод > Duck Punching" (см. пример 2), который изменяет метод jQuery $.unique()
для возврата уникальных элементов любого типа
(function($){
var _old = $.unique;
$.unique = function(arr){
// do the default behavior only if we got an array of elements
if (!!arr[0].nodeType){
return _old.apply(this,arguments);
} else {
// reduce the array to contain no dupes via grep/inArray
return $.grep(arr,function(v,k){
return $.inArray(v,arr) === k;
});
}
};
})(jQuery);
Ответ 8
это решение js1568, модифицированное для работы с массивом generic, например:
var genericObject=[
{genProp:'this is a string',randomInt:10,isBoolean:false},
{genProp:'this is another string',randomInt:20,isBoolean:false},
{genProp:'this is a string',randomInt:10,isBoolean:true},
{genProp:'this is another string',randomInt:30,isBoolean:false},
{genProp:'this is a string',randomInt:40,isBoolean:true},
{genProp:'i like strings',randomInt:60,isBoolean:true},
{genProp:'this is a string',randomInt:70,isBoolean:true},
{genProp:'this string is unique',randomInt:50,isBoolean:true},
{genProp:'this is a string',randomInt:50,isBoolean:false},
{genProp:'i like strings',randomInt:70,isBoolean:false}
]
Он принимает еще один параметр с именем propertyName, угадайте!:)
$.extend({
distinctObj:function(obj,propertyName) {
var result = [];
$.each(obj,function(i,v){
var prop=eval("v."+propertyName);
if ($.inArray(prop, result) == -1) result.push(prop);
});
return result;
}
});
поэтому, если вам нужно извлечь список уникальных значений для данного свойства, например значения, используемые для свойства randomInt, используйте это:
$.distinctObj(genericObject,'genProp');
он возвращает такой массив:
["this is a string", "this is another string", "i like strings", "this string is unique"]
Ответ 9
function array_unique(array) {
var unique = [];
for ( var i = 0 ; i < array.length ; ++i ) {
if ( unique.indexOf(array[i]) == -1 )
unique.push(array[i]);
}
return unique;
}
Ответ 10
Простое современное решение JavaScript, если вам не нужна поддержка IE (Array.from
не поддерживается в IE).
Вы можете использовать комбинацию Set
и Array.from
.
const arr = [1, 1, 11, 2, 4, 2, 5, 3, 1];
const set = new Set(arr);
const uniqueArr = Array.from(set);
console.log(uniqueArr);
Ответ 11
Вы можете использовать плагин jQuery под названием Array Utilities, чтобы получить массив уникальных элементов.
Это можно сделать следующим образом:
var distinctArray = $.distinct([1, 2, 2, 3])
distinctArray = [1,2,3]
Ответ 12
Если кто-то использует knockoutjs, попробуйте:
ko.utils.arrayGetDistinctValues()
Кстати, посмотрите все утилиты ko.utils.array*
.
Ответ 13
Как и в jQuery 3.0, вы можете использовать $.uniqueSort(ARRAY)
Пример
array = ["1","2","1","2"]
$.uniqueSort(array)
=> ["1", "2"]
Ответ 14
Если вам нужно поддерживать IE 8 или более раннюю версию, вы можете использовать jQuery для этого.
var a = [1,2,2,3,4,3,5];
var unique = $.grep(a, function (item, index) {
return index === $.inArray(item, a);
});