Если вам не нужно сохранять исходный объект, вы можете его закодировать и создать новый массив уникальных значений. В C # используйте Список, чтобы получить доступ к требуемой функциональности. Это не самое привлекательное или интеллектуальное решение, но оно работает.
int[] numbers = new int[] {1,2,3,4,5,1,2,2,2,3,4,5,5,5,5,4,3,2,3,4,5};
List<int> unique = new List<int>();
foreach (int i in numbers)
if (!unique.Contains(i))
unique.Add(i);
unique.Sort();
numbers = unique.ToArray();
Я предполагаю, что вы не знаете о методе Hash # за исключением , который ActiveSupport добавляет к Hash.
Это позволит упростить ваш код до:
redirect_to my_path(params.except(:controller, :action, :other_key))
Кроме того, вам не нужно будет патчить обезьяну, поскольку команда Rails сделала это за вас!
Я был бы полностью доволен кодом, который вы изначально разместили в своем вопросе.
[:controller, :action, :other_key].each { |k| params.delete(k) }
Другой способ сформулировать ответ dmathieu мог бы быть
params.delete_if { |k,v| [:controller, :action, :other_key].include? k }
Запустить патч обезьяны?
class Hash
def delete_keys!(*keys)
keys.flatten.each do |k|
delete(k)
end
self
end
def delete_keys(*keys)
_dup = dup
keys.flatten.each do |k|
_dup.delete(k)
end
_dup
end
end
Я не знаю, что, по вашему мнению, не так в предложенном вами решении. Я полагаю, вам нужен метод delete_all
на Hash или что-то в этом роде? Если это так, ответ Тадмана дает решение. Но, честно говоря, я думаю, что ваше решение чрезвычайно простое. Если вы часто используете это, вы можете заключить его в вспомогательный метод.
При использовании Hash # except
решает вашу проблему, имейте в виду, что это создает потенциальных проблем безопасности . Хорошее практическое правило обработки любых данных от посетителей - использовать подход с использованием белого списка. В этом случае вместо этого используется Hash # slice
.
params.slice!(:param_to_remove_1, :param_to_remove_2)
redirect_to my_path(params)