2014-11-23 6 views
1

Я использую clojurescript 0.0-2371, и я пытаюсь написать код, который будет клонировать объект. У меня есть этот код, в котором я хочу, чтобы клонировать узел и вызывает clone-object функцию:clojurescript итерация по клавишам объекта

(def animate 
    (js/React.createClass 
    #js 
    {:getInitialState 
    (fn [] 
     (this-as this 
       {:children 
       (-> 
       (.. this -props -children) 
       (js/React.Children.map (fn [child] child)) 
       (js->clj :keywordize-keys false))})) 
    :render 
    (fn [] 
     (this-as this 
       (let [children (:children (.. this -state))] 
       (doseq [[k v] children] 
        (clone-object (aget children k))))))})) 

clone-object выглядит следующим образом:

(defn clone-object [obj] 
    (log/debug obj) 
    (doseq [[k v] obj] 
    (log/debug k))) 

И если я называю clone-object так:

(doseq [[k v] children] 
    (clone-object v)) 

Я получаю эту ошибку:

Uncaught Error: [object Object] is not ISeqable

ответ

8

Ответ был использовать goog.object.forEach:

(defn clone-object [key obj] 
    (goog.object/forEach obj 
    (fn [val key obj] 
     (log/debug key)))) 
+1

Почему аргумент 'key'? – Marcs

1

Вам не нужно строго Google Closure для цикла с помощью клавиш:

(defn obj->vec [obj] 
    "Put object properties into a vector" 
    (vec (map (fn [k] {:key k :val (aget obj k)}) (.keys js/Object obj))) 
) 

; a random object 
(def test-obj (js-obj "foo" 1 "bar" 2)) 

; let's make a vector out of it 
(def vec-obj (obj->vec test-obj)) 

; get the first element of the vector and make a key value string 
(str (:key (first vec-obj)) ":" (:val (first vec-obj))) 

О obj->vec:

  • vec преобразования последовательности к вектору (необязательно, если вы в порядке с последовательностью)
  • map выполнить (fn [k] ...) для каждого элемента списка.
  • (fn [k] ...) Возьмите k элемент списка и поместить его в структуру данных карты ключ/значение, aget принимает obj свойство называют по ключевым k.
  • (.keys js/Object obj) Получить все ключи от объекта js.
Смежные вопросы