#javascript #php #ajax #arrays #object
#javascript #php #ajax #массивы #объект
Вопрос:
На самом деле у меня возникли некоторые проблемы с четким определением названия для этого вопроса.
У меня есть массив с одним объектом в качестве значения, определенного цифровым ключом (в данном случае 22895). Теперь, что произойдет, если я отправлю этот массив через Ajax, PHP получит массив с 22895 ключами, где первые 22894 из них пусты.
Я делаю что-то не так с определением JS-Array / Object или что исправить в этом случае?
Мой консольный вывод (браузер) выглядит следующим образом:
В то время как отладка PHP показывает следующее:
Я думаю, это очевидно: мне нужно, чтобы массив содержал только одно отправленное значение (с сохранением назначения ключа)
Редактировать: вот как я делаю Ajax:
$.ajax({
url: baseurl '/module/functionName',
context: this,
type: "POST",
dataType: "json",
data: {
splitTicket: {
tasks: Review.splitTicket.data.tasks
}
}
(...)
Комментарии:
1. «я отправляю этот массив через Ajax» — пожалуйста, покажите нам, как именно.
Ответ №1:
Вот как $.param
это работает. Если он видит массив, он предполагает, что он является «нормальным» плотным:
data=[]; data[10]=99;
$.param({t:data})
ВОЗВРАТ
"t[]=undefinedamp;t[]=undefinedamp;t[]=undefinedamp;t[]=undefinedamp;t[]=undefinedamp;t[]=undefinedamp;t[]=undefinedamp;t[]=undefinedamp;t[]=undefinedamp;t[]=undefinedamp;t[]=99"
Преобразуйте свой массив в объект, чтобы избежать этого:
$.param({t:$.extend({}, data)})
Результат:
"t[10]=99"
Чтобы сделать это рекурсивно
var ary2obj = function(obj) {
if($.isArray(obj))
return ary2obj($.extend({}, obj));
if($.isPlainObject(obj)) {
var res = {};
$.each(obj, function(k, v) {
res[k] = ary2obj(v);
});
return res;
}
return obj;
}
Комментарии:
1. И как этого избежать?
2. Есть ли способ применить этот рекурсивный метод?