Объект с цифровыми клавишами в любом случае отправит все предыдущие номера

#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;
}
  

http://jsfiddle.net/CAv9P/

Комментарии:

1. И как этого избежать?

2. Есть ли способ применить этот рекурсивный метод?