JSON и jQuery- добавление элемента из переменной?

12
J
На сайте с 02.02.2009
Offline
53
9274

var data = {

sVar: '',
aVar: new Array(),
oVar: {}
}

Вопрос - как ПРАВИЛЬНО добавить элемент в data.oVar?

Сейчас сделан грязный хак -

var tmp = {};

$("input[class='select']").each(function(i){
tmp[$(this).attr('name')] = $(this).attr('value');
});
data.oVar = tmp;

Ожидаемо, но не работает:


data.oVar[$(this).attr('name')] = $(this).attr('value');
data.oVar = {$(this).attr('name') : $(this).attr('value')};
data.oVar.$(this).attr('name') = $(this).attr('value');

Не сказал бы, что я силён в JS - так что если тут где-то явно что-то не так - не ругайтесь, а подскажите, пожалуйста, как сделать правильно :)

[Удален]
#1

элементарно, Ватсон.

object.property=value

в т.ч. object.method=function(params) {}

В вашем случае data.oVar.что-то=чему-то

Только я не припомню чтобы массив обозначался {}

Если это именно массив, то надо обращаться через []

Посмотрели бы исходники самого Jquery =)

J
На сайте с 02.02.2009
Offline
53
#2

Ожидаемо - но не работает :)

data.oVar.$(this).attr('name') = $(this).attr('value');

Ругается, что $ is not a function!

JTRTA
На сайте с 06.07.2008
Offline
25
#3

Если в нотации json передать массив то вроде бы можно только

задать строку в формате s = '{"a":"b","b":"a"}';

а затем сделать eval(s);

Дизайн /ru/forum/493415 (/ru/forum/493415) Верстка от 15$ /ru/forum/509339 (/ru/forum/509339) Сайты под ключ aiogino.studio@gmail.com icq: 460146806
[Удален]
#4

вы че то не догоняете.

$ это функция JQuery на верхнем уровне, она не может быть методом объекта oVar, если вы её насильно не пропишете.

Я кажется понял что вы хотите сделать.

Во-первых для этого в jQuery есть чудная функция form.serialize

Во-вторых использование переменных в именах объектов это очень извратно. хз как это сделать и возможно ли это. Вам тогда нужно объявить oVar как массив (Array или []) а не как объект

В-третьих, не надо лепить jQuery там, где это не является необходимым.

data.oVar[this.name]=this.value

neolord добавил 03.06.2009 в 17:53

JTRTA:
Если в нотации json передать массив то вроде бы можно только
задать строку в формате s = '{"a":"b","b":"a"}';
а затем сделать eval(s);

вы тоже не отличаете {} от [] ?

{} - это нотация объекта в широком смысле

а [] - это нотация массива.

JQuery к тому же сам евалюирует строчки в формате JSON

J
На сайте с 02.02.2009
Offline
53
#5

Спасибо.)

Но по неведомой мне причине - когда я обьявляю oVar как Array или [], а потом делаю из него хеш - это всё не проходит в JSON.stringify(data) - пустой получается элемент, - хотя на самом деле к нему можно обратиться и получить данные.

[Удален]
#6

Перед передачей массива функции stringify с ним ничего не надо делать. Но ваще лучше не полагаться на наличие хорошей поддержки JSON в браузере и юзать например http://code.google.com/p/jquery-json/

JTRTA
На сайте с 06.07.2008
Offline
25
#7
neolord:
вы че то не догоняете.
вы тоже не отличаете {} от [] ?
{} - это нотация объекта в широком смысле
а [] - это нотация массива.
JQuery к тому же сам евалюирует строчки в формате JSON

Встречный вопрос тогда: чем отличается с точки зрения json массив с не целочисленными ключами и соотношение поле.значение ?

Элементарный пример, если попробовать код:

<?php $a['a'] = 'b'; $a['b'] = 'a'; echo json_encode($a); ?>

посмотрите как массив преобразуется в нотацию json,

Кроме того известный факт что к полям объекта через js можно обращаться хоть как к объекту, хоть как к массиву, странность конечно, но имеет место

Видимо это объясняется тем что объект все-таки это совокупность не только полей, но и методов.JSON же передает только набор ассоциированных значений(по существу массива), а там уж на усмотрение программиста как данные интерпретировать.

[Удален]
#8
JTRTA:
чем отличается с точки зрения json массив с не целочисленными ключами и соотношение поле.значение

Пожалуйста -

{field:value,field2:value2} - instanceof Object

[field:value,field2:value2] - instanceof Array.

Чем Array от Object отличается, надеюсь, не надо объяснять?

А ваш пример несколько неуместен, потому что никто вам не обещал что массив PHP будет преобразовываться этой функцией из PECL в массив JSON. А аналога прототипируемых объектов в PHP просто нет. Лучше посмотрите как происходит преобразование из Array в JSON на стороне Javascript.

JTRTA
На сайте с 06.07.2008
Offline
25
#9
neolord:
Пожалуйста -
[field:value,field2:value2] - instanceof Array.
Чем Array от Object отличается, надеюсь, не надо объяснять?

может я что то не так делаю, но такой способ задания массива,как не старался, в js всегда выдает ошибку. Подозреваю, что можно использовать только [value1,value2,value3]

а по поводу разницы объясните тогда вот такую штуку:


var mss = {'a':'1','b':'1','c':'3'};
alert (mss.a);
alert (mss['a']);
var mss2 = new Array();
mss2.a = 1;
alert (mss2.a);
alert (mss2['a']);

и все нормально работает во всех случаях

[Удален]
#10

Тут есть один нюанс, который описан в документации O'Reily. К сожалению, по неясной мне причине, я не могу скопипастить из этого пдфа. Суть в том, что строковые индексы массива ведут себя как свойства объекта. т.е.


var mss=[1,2,3];
mss['text']='value';
console.log(mss)

выдаст 123, а текстовые индексы пропустит, зато mss.text==mss['text']; С числовыми индексами так не прокатит. Так что в чем то вы правы, но таки обратите внимание, КАК сериализуется объект, и как - массив.

Из чего можно сделать вывод что таки можно давать объектам свойства с переменными через [] - этого я кстати не знал. Но разница между конструктором {} и [] все таки есть.


>>> var Arr1=[1,2,3]
>>> for (i in Arr1) console.log(i);
0
1
2
each
eachSlice
all
any
collect
detect
findAll
grep
include
inGroupsOf
inject
invoke
max
min
partition
pluck
reject
sortBy
toArray
zip
size
inspect
find
select
member
entries
_reverse
_each
clear
first
last
compact
flatten
without
uniq
intersect
clone
toJSON

>>> Arr2={name:'value',other:'some'}
Object name=value other=some
>>> for (i in Arr2) console.log(i);
name
other

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

Так что, обращаясь к ТСу, могу сказать: Disregard this, I suck cocks =)

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий