如何将带有对象作为键的 Ruby 哈希对象作为 Map 对象发送到前端 Javascript
Posted
技术标签:
【中文标题】如何将带有对象作为键的 Ruby 哈希对象作为 Map 对象发送到前端 Javascript【英文标题】:How to send a Ruby hash object with objects as keys to front end Javascript as a Map object 【发布时间】:2021-10-12 05:29:59 【问题描述】:javascript 不支持将对象作为对象键,但 Map 对象支持。我的问题是,有没有办法轻松地将这样的对象从后端发送到前端?
def test_controller
object = "a"=>1,"b"=>2
front_end_object = object => 5
render json: front_end_object, status: 200
end
$.ajax(
type:"POST",
url: "/pull_from_test_controller",
dataType:"json",
contentType:"application/json",
data: ,
success: function(response, status_string, jqxhr)
console.log(response)
)
正如预期的那样,在前端记录的response
,因为它被转换为JSON,在后端内置了object
作为字符串键。
// console response
response = "a"=>"1","b"=>"2": 5
// further inspection
Object.keys(response)[0] = "\"a\"=>\"1\", \"b\"=>\"2\""
有什么方法可以在前端轻松地将它转换为 Map 对象以再次将对象作为键,或者在渲染过程中表明这一点?
我目前的解决方案只是 JSON.parse,但这似乎很笨重
JSON.parse(Object.keys(response)[0])
【问题讨论】:
developer.mozilla.org/en-US/docs/Web/JavaScript/…(链接自Map
) - 如果我理解正确,对象将不相等。一种可能的解决方法是使用字符串化对象作为键。
【参考方案1】:
您正确地注意到,在 JS 中,对象键应该是字符串。那么为什么不简单地使用字符串呢?
# In Ruby
def test_controller
object = "a"=>1,"b"=>2
front_end_object = "key"=>object, "value"=>5 # Look here
render json: front_end_object, status: 200
end
// In JS
$.ajax(
type:"POST",
url: "/pull_from_test_controller",
dataType:"json",
contentType:"application/json",
data: ,
success: function(response, status_string, jqxhr)
console.log(response)
// Should be: "key":"a":1,"b":2,"value":5
// Then no need to parse or anything, just access the values directly.
console.log(response.key) // "a":1,"b":2
console.log(response.key.a) // 1
console.log(response.key.b) // 2
console.log(response.value) // 5
)
我建议你使用一些比key
和value
更有意义的名称;)
【讨论】:
以上是关于如何将带有对象作为键的 Ruby 哈希对象作为 Map 对象发送到前端 Javascript的主要内容,如果未能解决你的问题,请参考以下文章
ruby 关于红宝石的冥想哈希与触发器作为键的“dinamic条件”
Redis设计与实现3 哈希对象( ziplist /hashtable)
错误:对象作为 React 子项无效(找到:带有键 的对象)。改用数组
React native - 对象作为 React 子对象无效(发现:带有键的对象 $$typeof, type, key, ref, props, _owner, _store)