Я пытаюсь сравнить два хэша Ruby, используя следующий код:
#!/usr/bin/env ruby
require "yaml"
require "active_support"
file1 = YAML::load(File.open('./en_20110207.yml'))
file2 = YAML::load(File.open('./locales/en.yml'))
arr = []
file1.select { |k,v|
file2.select { |k2, v2|
arr << "#{v2}" if "#{v}" != "#{v2}"
}
}
puts arr
На экран выводится полный файл из file2. Я точно знаю, что файлы разные, но скрипт, кажется, не улавливает их.
Ответы:
Вы можете напрямую сравнивать хэши на равенство:
Вы можете преобразовать хэши в массивы, а затем узнать их разницу:
Дальнейшее упрощение:
Назначение разницы через тернарную структуру:
Сделаем все за одну операцию и избавимся от
difference
переменной:источник
hash1.to_a - hash3.to_a
иhash3.to_a - hash1.to_a
могут возвращать непустые значенияhash1.size == hash3.size
. Часть после EDIT действительна, только если хеши имеют другой размер..to_a
не удастся, если у одинаковых хэшей ключи находятся в другом порядке:{a:1, b:2} == {b:2, a:1}
=> true,{a:1, b:2}.to_a == {b:2, a:1}.to_a
=> falseflatten
и*
? Почему не просто такHash[A.to_a - B.to_a]
?Вы можете попробовать гем hashdiff , который позволяет глубоко сравнивать хеши и массивы в хеше.
Ниже приводится пример:
источник
got_hash.should eql expected_hash
сHashDiff.diff(got_hash, expected_hash).should eql []
I теперь получить выходной сигнал , который показывает , что именно мне нужно. Отлично!use_lcs: false
флага может значительно ускорить сравнение на больших хэшах:Hashdiff.diff(b, a, use_lcs: false)
Если вы хотите узнать, в чем разница между двумя хешами, вы можете сделать это:
источник
Rails отказывается от этого
diff
метода.Для быстрого однострочника:
источник
to_s
.{a:1, b:2} == {b:2, a:1}
=> true,{a:1, b:2}.to_s == {b:2, a:1}.to_s
=> falseВы можете использовать простое пересечение массивов, чтобы узнать, чем отличается каждый хеш.
источник
У меня была такая же проблема, и я отправил запрос на перенос на рельсы
https://github.com/elfassy/rails/commit/5f3410e04fe8c4d4745397db866c9633b80ccec6
источник
Если вам нужна быстрая и грязная разница между хешами, которая правильно поддерживает нулевые значения, вы можете использовать что-то вроде
источник
Если вам нужен красиво отформатированный diff, вы можете сделать это:
И в вашем коде:
Идея состоит в том, чтобы использовать отличную печать для форматирования и различать вывод. Разница не будет точной, но полезна для отладки.
источник
... и теперь в виде модуля, который будет применяться к различным классам коллекций (в том числе Hash). Это не глубокая проверка, но все просто.
источник
Я разработал это, чтобы сравнить, равны ли два хэша
Использование:
источник
На этот вопрос ответили в разделе « Сравнение рубиновых хешей ». Rails добавляет
diff
метод к хешам. Это работает хорошо.источник
как насчет преобразования хэша в_json и сравнения как строки? но имея в виду, что
источник
Вот алгоритм для глубокого сравнения двух хэшей, который также будет сравнивать вложенные массивы:
Реализация:
источник
Как насчет другого, более простого подхода:
источник