У меня такой массив:
var foo = [ { "a" : "1" }, { "b" : "2" }, { "a" : "1" } ];
Я бы хотел отфильтровать его, чтобы:
var bar = [ { "a" : "1" }, { "b" : "2" }];
Я пробовал использовать _.uniq, но думаю, поскольку { "a" : "1" }
он не равен самому себе, он не работает. Есть ли способ предоставить подчеркивание uniq с переопределенной функцией равенства?
{ "a" : "2" }
существуют? Если да, то что делает его уникальным - атрибут или значение?Ответы:
.uniq / .unique принимает обратный вызов
Ноты:
Другой пример: использование обратного вызова для извлечения марок автомобилей, цветов из списка
источник
false
не требуется для_.uniq()
. Также в lodash вы могли бы написать это так_.uniq(a, 'a');
, поскольку он будет отбирать свойствоa
у объектов._.uniq(a, false, 'a')
). Я отправил ping-запрос на github / bestiejs / lodash, и они сказали, что проблема решена на грани. Поэтому, если вы не используете функцию, убедитесь, что у вас установлена последняя версия. Это может не быть проблемой для подчеркивания.Если вы хотите удалить дубликаты на основе идентификатора, вы можете сделать что-то вроде этого:
источник
Date
. Однако это так.Реализация ответа Шиплу.
источник
JSON.parse(x[0]).a
что x - это не массив объектов, а массив строк. Кроме того, если вы добавите значения b к уникальным объектам и измените порядок значений a / b, они больше не будут считаться уникальными для вашей функции. (например, `" {\ "a \": \ "1 \", \ "b \": 2} "! =" {\ "b \": 2, \ "a \": \ "1 \"} ") Может, я чего-то упускаю, но разве результат не должен быть хоть сколько-нибудь полезен?" Вот jsbin для иллюстрации jsbin.com/utoruz/2/edita
для каждого объекта, когда могут быть повторяющиеся объекты, не содержащие ключаa
. Однако это имело бы смысл, если быa
был уникальный идентификатор.(a ==(=) b when a = b = {a:1})
. Смысл моего ответа - итератор. Я пытался ответить, не беспокоясь о мотиве, который может быть любым, верно? (например, возможно, они хотели извлечь список марок и цветов из списка автомобилей на выставке. jsbin.com/evodub/2/edit ) Ура!iterator
Когда у меня есть идентификатор атрибута, это мой предпочтительный способ подчеркивания:
источник
Используя уникальную библиотеку подчеркивания, у меня работает следующее: я делаю список уникальным на основе _id, а затем возвращаю строковое значение _id:
источник
Вот простое решение, которое использует глубокое сравнение объектов для проверки дубликатов (не прибегая к преобразованию в JSON, что неэффективно и взломано)
Он отфильтровывает все элементы, если они имеют дубликат позже в массиве - таким образом, сохраняется последний повторяющийся элемент.
Тестирование на дублирование использования,
_.isEqual
которое выполняет оптимизированное глубокое сравнение между двумя объектами, см. В документации isEqual с подчеркиванием для получения дополнительной информации.изменить: обновлено для использования,
_.filter
что является более чистым подходомисточник
В документации lodash 4.6.1 это есть как пример равенства ключей объекта:
_.uniqWith(objects, _.isEqual);
https://lodash.com/docs#uniqWith
источник
Попробуйте функцию итератора
Например, вы можете вернуть первый элемент
источник
_.uniq(x,function(i){ return i[0]; });
вот мое решение (coffeescript):
пример:
источник
с подчеркиванием мне пришлось использовать String () в функции итератора
источник
Я хотел решить это простое решение простым способом написания, с небольшими вычислительными затратами ... но разве это не тривиальное решение с минимальным определением переменной, не так ли?
источник
Давайте разберемся с этим. Сначала давайте сгруппируем элементы массива по их строковому значению
grouped
выглядит как:Затем возьмем первый элемент из каждой группы
bar
выглядит как:[ { "a" : "1" }, { "b" : "2" } ]
Поставить все это вместе:
источник
Вы можете сделать это в сокращенном виде:
_.uniq(foo, 'a')
источник