Удалить повторяющиеся поля в массиве хэшей Ruby

У меня есть массив хэшей, в котором есть 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,
}]

Любые идеи?

Спасибо!

Тот факт, что элементы массива являются хэшами, значения не имеет. Ответ тот же для массива [1, 2, 2, 4].

Cary Swoveland 11.05.2022 01:02
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
1
52
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Попробуйте 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, как это сделать?

Yung Sifilis 10.05.2022 09:46

В вашем примере нет name. Вы можете использовать uniq с блоком: ary.uniq { |hash| hash[:name] }

mechnicov 10.05.2022 09:56

@YungSifilis, если у вас есть такие элементы, неясно, какие из разных значений lon вы хотите сохранить. Или, может быть, вы хотите рассчитать среднее значение в этом случае. Пожалуйста, обновите свой вопрос соответственно.

Stefan 10.05.2022 13:55

@YungSifilis uniq с блоком сохранит первый дубликат

mechnicov 10.05.2022 14:06

используйте .uniq это должно сработать для вас. NB: ваш массив хэшей имеет дополнительное пространство после каждого ключа. Вы должны удалить его.

Другие вопросы по теме