编写将我的 json 数组转换为我想要的格式的 coffeescript 函数的简洁方法是什么
What is a succinct way to write a coffeescript function that converts my json array into the format that I want
我有这个 json 对象:
op = [{"id":7,"d_set_id":1,"option_value_id":5,"product_id":3,"model":"1300","option_type":"Plunger Diameter","option":"5.0 inch Plunger Diameter","product":"Packing","route":"part_option_values","reqParams":null,"restangularized":true,"fromServer":true,"parentResource":{"route":"parts","parentResource":null,"id":"29"},"restangularCollection":false},{"id":9,"d_set_id":5,"option_value_id":11,"product_id":3,"model":"1300","option_type":"main drum diameter","option":"1.0 main drum diameter","product":"Packing","route":"part_option_values","reqParams":null,"restangularized":true,"fromServer":true,"parentResource":{"route":"parts","parentResource":null,"id":"29"},"restangularCollection":false}]
我写了这个函数来把它转换成我想要的格式:
addItems: (op) ->
variant = {
product_id: "undefined"
model: "undefined"
options: []
product: "undefinded"
option_value_ids: []
quantity: 1
}
op.forEach (obj,i) ->
variant.product_id = obj.product_id
variant.model = obj.model
variant.options.push obj.option
variant.product = obj.product
variant.option_value_ids.push obj.option_value_id
variant.options = variant.options.join(', ')
items.push variant
成功变成我想要的结果
items = [{"product_id":3,"model":"1300","options":"5.0 inch Plunger Diameter, 1.0 main drum diameter","product":"Packing","option_value_ids":[5,11],"quantity":1},{"product_id":3,"model":"1300","options":"5.0 inch Plunger Diameter, 1.0 main drum diameter","product":"Packing","option_value_ids":[5,11],"quantity":1}]
...但这似乎不是编写此函数的非常简洁的方法。什么是更好的方法?
是的!这一切都可以用三个概念简洁地完成。映射、解构和对象 Shorthand 表示法(所有三个在 ES2015/6 以及 coffeescript 中可用)
options = []
ids = []
# We need to aggregate id's and options first
for {option_value_id, option} in op
ids.push option_value_id
options.push option
# Map through to the new Object
items = op.map ({ product_id, model, product}) ->
{
product_id
model
options: options
product
option_value_ids: ids
quantity: 1
}
Array.map 将获取一个数组并转换每个元素(在本例中是较大对象的子集)和 return 一个新数组。我们将解构参数中传入的对象,然后 shorthand 将它们恢复为对象格式。
我有这个 json 对象:
op = [{"id":7,"d_set_id":1,"option_value_id":5,"product_id":3,"model":"1300","option_type":"Plunger Diameter","option":"5.0 inch Plunger Diameter","product":"Packing","route":"part_option_values","reqParams":null,"restangularized":true,"fromServer":true,"parentResource":{"route":"parts","parentResource":null,"id":"29"},"restangularCollection":false},{"id":9,"d_set_id":5,"option_value_id":11,"product_id":3,"model":"1300","option_type":"main drum diameter","option":"1.0 main drum diameter","product":"Packing","route":"part_option_values","reqParams":null,"restangularized":true,"fromServer":true,"parentResource":{"route":"parts","parentResource":null,"id":"29"},"restangularCollection":false}]
我写了这个函数来把它转换成我想要的格式:
addItems: (op) ->
variant = {
product_id: "undefined"
model: "undefined"
options: []
product: "undefinded"
option_value_ids: []
quantity: 1
}
op.forEach (obj,i) ->
variant.product_id = obj.product_id
variant.model = obj.model
variant.options.push obj.option
variant.product = obj.product
variant.option_value_ids.push obj.option_value_id
variant.options = variant.options.join(', ')
items.push variant
成功变成我想要的结果
items = [{"product_id":3,"model":"1300","options":"5.0 inch Plunger Diameter, 1.0 main drum diameter","product":"Packing","option_value_ids":[5,11],"quantity":1},{"product_id":3,"model":"1300","options":"5.0 inch Plunger Diameter, 1.0 main drum diameter","product":"Packing","option_value_ids":[5,11],"quantity":1}]
...但这似乎不是编写此函数的非常简洁的方法。什么是更好的方法?
是的!这一切都可以用三个概念简洁地完成。映射、解构和对象 Shorthand 表示法(所有三个在 ES2015/6 以及 coffeescript 中可用)
options = []
ids = []
# We need to aggregate id's and options first
for {option_value_id, option} in op
ids.push option_value_id
options.push option
# Map through to the new Object
items = op.map ({ product_id, model, product}) ->
{
product_id
model
options: options
product
option_value_ids: ids
quantity: 1
}
Array.map 将获取一个数组并转换每个元素(在本例中是较大对象的子集)和 return 一个新数组。我们将解构参数中传入的对象,然后 shorthand 将它们恢复为对象格式。