Javascript 编写coffeescript函数将json数组转换为所需格式的简洁方法是什么

Javascript 编写coffeescript函数将json数组转换为所需格式的简洁方法是什么,javascript,coffeescript,Javascript,Coffeescript,我有一个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,

我有一个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}]

。。。但这似乎不是一种非常简洁的函数编写方法。什么是更好的方法?

是的!这可以通过三个概念简洁地完成。映射、解构和对象速记符号(所有这三种都在ES2015/6和coffeescript中提供)

map将获取一个数组并转换每个元素(在本例中是较大对象的子集),然后返回一个新数组。我们将在参数中分解传入对象,然后将它们速记回对象格式


是的!这可以通过三个概念简洁地完成。映射、解构和对象速记符号(所有这三种都在ES2015/6和coffeescript中提供)

map将获取一个数组并转换每个元素(在本例中是较大对象的子集),然后返回一个新数组。我们将在参数中分解传入对象,然后将它们速记回对象格式


好的,我还没有做过任何咖啡脚本,但是你不能省略
variant
的初始声明吗?我想您应该能够创建并定义所有属性,然后将其添加到
items
数组中,所有这些都在
forEach
循环中。这将把代码大约减少一半。为了提高性能,仅供参考,我会避免使用forEach,而是使用“For key,obj in op”。然后照@vlaz说的做。好吧,我还没有做过任何咖啡脚本,但是你能不能省略
variant
的初始声明?我想您应该能够创建并定义所有属性,然后将其添加到
items
数组中,所有这些都在
forEach
循环中。这将把代码大约减少一半。为了提高性能,仅供参考,我会避免使用forEach,而是使用“For key,obj in op”。照@vlaz说的做,你太棒了!很高兴能帮上忙,谢谢!你真棒!很高兴能帮上忙,谢谢!
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
  }