对象迭代语法

时间:2014-11-17 11:47:45

标签: javascript angularjs coffeescript

拥有以下对象数组:

obj = [
  column:
    label: "Name"
    value: "name"
  operator:
    label: "Greater than"
    value: "_greater_than"
  input_value: "foo"
  ... ]   

然后我可以构造另一个用作URL参数的对象,如下所示:

query = {}
angular.forEach(obj, (k, v) -> 
  query = ["c[" + k.column.value + k.operator.value + "]=" + k.input_value]
)

这会返回如下内容:

  

[ “C [name_greater_than] = foo” 的]

虽然这样做意味着我觉得这个代码有点(非常?)脏,所以有没有办法让这条线更优雅或更有效?

query = ["c[" + k.column.value + k.operator.value + "]=" + k.value]

1 个答案:

答案 0 :(得分:0)

由于两个原因,您的angular.forEach来电没有意义:

  1. obj只显示为单个对象,因此迭代器没有任何内容。
  2. angular.forEach在迭代对象时将回调值传递给键,但参数为(k, v)
  3. 基于此,我猜测obj实际上是一个对象数组,看起来像问题顶部的obj

    在这种情况下,你可以使用一个简单的循环:

    query = { }
    for e in objs
      query["#{e.column.value}#{e.operator.value}"] = e.value
    

    如果query = { }冒犯了您,请使用reduce

    query = objs.reduce(
      (q, e) -> q["#{e.column.value}#{e.operator.value}"] = e.value; q
      { }
    )
    

    你可能想这样写:

    query = objs.reduce(
      (q, e) ->
        q["#{e.column.value}#{e.operator.value}"] = e.value
        q
      { }
    )
    

    如果您不习惯谨慎关注reduce回调的返回值。