Я решаю это, используя $ .each и добавляя пары ключ-значение в мои форм-данные.
$.each(personfood.details, function (key, value) {
personfoods.append("details[" + key + "]",value);
});
Для быстрого решения просто используйте хеш-таблицы, как был упомянут прежде.
Однако, если Вы предпочитаете более принципиальный подход, можно смотреть на FSet, который является “функциональной относящейся к теории множеств библиотекой наборов”. Среди других это содержит классы и операции для наборов и сумок.
(РЕДАКТИРОВАНИЕ:) Самый чистый путь состоял бы в том, чтобы, вероятно, определить Ваши ориентированные на набор операции как родовые функции. Ряд родовых функций в основном эквивалентен интерфейсу Java, в конце концов. Можно просто реализовать методы на стандартном классе ХЕШ-ТАБЛИЦЫ как первый прототип и позволить другие реализации также.
Взгляд на контейнеры статьи. Существует контейнерный класс набора.
Вы могли использовать списки, хотя они могут оказаться неэффективными для представления больших наборов. Это сделано с помощью, ПРИМЫКАЮТ или PUSHNEW, чтобы добавить новый элемент к списку, и УДАЛИТЬ или УДАЛИТЬ, чтобы сделать противоположное.
(let ((set (list)))
(pushnew 11 set)
(pushnew 42 set)
(pushnew 11 set)
(print set) ; set={42,11}
(setq set (delete 42 set))
(print set)) ; set={11}
Одна вещь не упустить является всем, что эти операторы используют EQL по умолчанию для тестирования на потенциальные дубликаты в наборе (как Java использует, равняется методу). Это хорошо для, определяет номера содержания или символы, но для наборов других объектов, 'более глубокий' тест равенства такой столь же РАВНЫЙ должен быть указан как a: ПРОТЕСТИРУЙТЕ ключевой параметр, например, для ряда строк:-
(let ((set (list)))
(pushnew "foo" set :test #'equal)
(pushnew "bar" set :test #'equal)
(pushnew "foo" set :test #'equal) ; EQUAL decides that "foo"="foo"
(print set)) ; set={"bar","foo"}
Дубликаты Lisp к некоторым Операциям присвоения Java:
Да, это имеет наборы. Посмотрите этот раздел по "Наборам" от Практического языка Common LISP.
В основном можно создать набор с pushnew
и adjoin
, запросите его с member
, member-if
и member-if-not
, и объедините его с другими наборами с функциями как intersection
, union
, set-difference
, set-exclusive-or
и subsetp
.
Легко разрешимое использование хеш-таблицы.
(let ((h (make-hash-table :test 'equalp))) ; if you're storing symbols
(loop for i from 0 upto 20
do (setf (gethash i h) (format nil "Value ~A" i)))
(loop for i from 10 upto 30
do (setf (gethash i h) (format nil "~A eulaV" i)))
(loop for k being the hash-keys of h using (hash-value v)
do (format t "~A => ~A~%" k v)))
выводы
0 => Value 0
1 => Value 1
...
9 => Value 9
10 => 10 eulaV
11 => 11 eulaV
...
29 => 29 eulaV
30 => 30 eulaV
Не то, чтобы я знаю, но можно использовать хеш-таблицы для чего-то весьма схожего.
Хеш-таблицы Lisp являются базирующимся CLOS. Спецификации здесь.
Лично, я просто реализовал бы функцию, которая берет список, и возвратите уникальный набор. Я спроектировал что-то вместе, которое работает на меня:
(defun make-set (list-in &optional (list-out '()))
(if (endp list-in)
(nreverse list-out)
(make-set
(cdr list-in)
(adjoin (car list-in) list-out :test 'equal))))
В основном, adjoin
функция предварительно ожидает объект к списку непагубно, если и только если объект уже не присутствует в списке, принимая дополнительную тестовую функцию (один из языка Common LISP "равные" функции). Можно также использовать pushnew
чтобы сделать так пагубно, но я нахожу, что рекурсивная хвостом реализация намного более изящна. Так, Lisp действительно экспортирует несколько основных функций, которые позволяют Вам использовать список в качестве набора; никакой встроенный тип данных не необходим, потому что можно просто использовать различные функции для преднезаконченных вещей к списку.
Мой источник данных для всего этого (не функция, но информация) был комбинацией языка Common LISP HyperSpec и язык Common LISP Язык (2-й Выпуск).