LINUX.ORG.RU

Почему JavaScript (CoffeeScript) не работает так, как я ожидаю?

 , ,


1

2

Привет, есть кусок кода которая переводить JS обьект на URL параметер, типа:

obj = { name: 'test', pwd: '123', data: { count: 2 } }
parameterize(obj) # => "name=test&pwd=123&data[count]=2"

На этих данных функция работает неправильно:

finish_game = {
  "clickCounter" : {"hint" : 0},
  "level": 0,
  "first_word": "Company",
  "edges": {
    "0" : [1,4]
  },
  "vertices":{
    "0" : {"text":"Company", "coordinates": [2427.6,2512.45]}
  }
}

qwe = {}
qwe.data = finish_game
qwe.auth_token = 'asdasd'
qwe.op = "q2wqwe"
qwe.game_code = 'qwe'

parameterize(qwe) # => data[clickCounter][hint]=0&data[clickCounter][level]=0&data[clickCounter][first_word]=Company&data[clickCounter][edges][vertices][0][text]=Company&data[auth_token]=asdasd&data[op]=q2wqwe&data[game_code]=qwe

# data[clickCounter][first_word]=Company  <-- Что ЭТО ???
# data[clickCounter][edges][vertices][0][text]=Company


Вот и сама функция:
parameterize = (params) ->
  pairs = []
  do proc = (object=params, prefix=null) ->
    for own key, value of object
      if value instanceof Array
        for el, i in value
          proc(el, if prefix? then "#{prefix}[#{key}][]" else "#{key}[]")
      else if value instanceof Object
        if prefix?
          prefix += "[#{key}]"
        else
          prefix = key
        proc(value, prefix)
      else
        pairs.push(if prefix? then "#{prefix}[#{key}]=#{value}" else "#{key}=#{value}")
  pairs.join('&')

Код вроде нормальный, подскажите в чем проблема если знаете.

UPDATE:
Хочу получить вот это:

"data[clickCounter][hint]=0&data[level]=0&data[first_word]=Company&data[edges][0][]=1&data[edges][0][]=4&data[vertices][0][text]=Company&data[vertices][0][coordinates][]=2427.6&data[vertices][0][coordinates][]=2512.45&auth_token=asdasd&op=q2wqwe&game_code=qwe"

parameterize(qwe) # =>
"data[clickCounter][hint]=0&data[clickCounter][level]=0&data[clickCounter][first_word]=Company&data[clickCounter][edges][vertices][0][text]=Company&data[auth_token]=asdasd&data[op]=q2wqwe&data[game_code]=qwe"

Код получен отсюда: http://stackoverflow.com/a/9472534



Последнее исправление: zhomart (всего исправлений: 2)
# data[clickCounter][first_word]=Company  <-- Что ЭТО ???

это из твоей структуры finish_game.

напиши, что ты хочешь получить на выходе

Mr_Gentoo
()
finish_game =
  clickCounter:
    hint: 0
  ,
  level: 0
  ,
  first_word: "Company"
  ,
  edges:
    0: [1,4]
  ,
  vertices:
    0: 
      text: "Company"
      coordinates: [2427.6,2512.45]

как-то так вроде

Что же ты данные входные не проверяешь, повнимательнее.

special-k ★★★★
()
Последнее исправление: special-k (всего исправлений: 2)
Ответ на: комментарий от Mr_Gentoo

Хочу получить вот это:

"data[clickCounter][hint]=0&data[level]=0&data[first_word]=Company&data[edges][0][]=1&data[edges][0][]=4&data[vertices][0][text]=Company&data[vertices][0][coordinates][]=2427.6&data[vertices][0][coordinates][]=2512.45&auth_token=asdasd&op=q2wqwe&game_code=qwe"

zhomart
() автор топика

prefix += «[#{key}]»

Поменяй на тернарный оператор, у тебя в функции растет префикс для словарей первого уровня каждый раз когда по ключу лежит объект.

zz ★★★★
()

у тебя префикс за циклом и после первого же прохода становится не null. Но наверное это не единственная ошибка. Упрощай данные и отлаживай, а то накалякал чего-то - нате.

special-k ★★★★
()
Последнее исправление: special-k (всего исправлений: 1)
Ответ на: комментарий от special-k

Ура

Мой друг исправил все таки :)

parameterize = (params) ->
  pairs = []
  do proc = (object=params, prefix=null) ->
    if object instanceof Object
      for own key, value of object
        if value instanceof Array
          for el, i in value
            proc(el, if prefix? then "#{prefix}[#{key}][]" else "#{i}")
        else if value instanceof Object
          proc(value, if prefix? then prefix + "[#{key}]" else key)
        else
          pairs.push(if prefix? then "#{prefix}[#{key}]=#{value}" else "#{key}=#{value}")
    else
      pairs.push(if prefix? then "#{prefix}=#{object}" else "#{object}")
  pairs.join('&')
zhomart
() автор топика
Ответ на: Ура от zhomart

Завязывай с тегами что у тебя в профиле, если тебе двух предыдущих сообщений не хватило чтобы починить самому.

zz ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.