У меня есть массив хэшей, в котором есть JSON с повторяющимися полями, и я хочу удалить дубликаты:
[ {
"code" : "32F",
"lon" : 0.963335,
"fint" : "2022-05-03T13:00:00",
"prec" : 0.0,
},{
"code" : "32F",
"lon" : 0.963335,
"fint" : "2022-05-03T13:00:00",
"prec" : 0.0,
},{
"code" : "90X",
"lon" : 0.963335,
"fint" : "2022-05-03T13:00:00",
"prec" : 0.0,
}]
Это желаемый результат:
[{
"code" : "32F",
"lon" : 0.963335,
"fint" : "2022-05-03T13:00:00",
"prec" : 0.0,
},{
"code" : "90X",
"lon" : 0.963335,
"fint" : "2022-05-03T13:00:00",
"prec" : 0.0,
}]
Любые идеи?
Спасибо!
Попробуйте uniq из модуля enumerables. Он должен работать изначально для вашего варианта использования. Он доступен по умолчанию с рубиновым массивом.
Сначала у вас неправильный синтаксис
"code" : "32F",
-- здесь пробелы не нужны
Правильный вариант "code": "32F",
И здесь даже кавычки не нужны. Просто code: "32F",
Для дубликатов удалять из массива -- используйте uniq!
Будь осторожен
ary = [1, 1]
ary.uniq! # => [1]
ary # => [1]
ary = [1, 2]
ary.uniq! # => nil
ary # => [1, 2]
Или используйте uniq
без взрыва, чтобы вернуть новый массив
ary = [1, 1]
ary.uniq # => [1]
ary # => [1, 1]
ary = [1, 2]
ary.uniq # => [1, 2]
ary # => [1, 2]
В твоем случае
ary =
[{
code: "32F",
lon: 0.963335,
fint: "2022-05-03T13:00:00",
prec: 0.0,
},{
code: "32F",
lon: 0.963335,
fint: "2022-05-03T13:00:00",
prec: 0.0,
},{
code: "90X",
lon: 0.963335,
fint: "2022-05-03T13:00:00",
prec: 0.0,
}]
ary.uniq!
# => [{:code=>"32F", :lon=>0.963335, :fint=>"2022-05-03T13:00:00", :prec=>0.0}, {:code=>"90X", :lon=>0.963335, :fint=>"2022-05-03T13:00:00", :prec=>0.0}]
Спасибо, эту работу для полей JSON я опубликовал. Но если у меня есть элементы с одинаковыми name
и разными lon
, как это сделать?
В вашем примере нет name
. Вы можете использовать uniq
с блоком: ary.uniq { |hash| hash[:name] }
@YungSifilis, если у вас есть такие элементы, неясно, какие из разных значений lon
вы хотите сохранить. Или, может быть, вы хотите рассчитать среднее значение в этом случае. Пожалуйста, обновите свой вопрос соответственно.
@YungSifilis uniq
с блоком сохранит первый дубликат
используйте .uniq
это должно сработать для вас.
NB: ваш массив хэшей имеет дополнительное пространство после каждого ключа. Вы должны удалить его.
Тот факт, что элементы массива являются хэшами, значения не имеет. Ответ тот же для массива
[1, 2, 2, 4]
.