Почему я не могу построить этот объект Javascript? - PullRequest
3 голосов
/ 13 марта 2010

У меня есть объект, который я пытаюсь заполнить другим объектом (то есть перебрать возвращаемый объект, чтобы получить объект только с выбранными значениями из оригинала). Мой код выглядит так:

var collect = {};

function getHistoricalData(username){
$.getJSON("http://url/" + username + ".json?params",
            function(data){
                for (var i=0; i < data.length; i++) {
                    console.log(i);
                    collect = { i : {text : data[i].text}};
                    $("#wrap").append("<span>" + data[i].text + "</span><br />");

                };
                console.log(collect);
            }); 

}

Итак, я использую Firebug для отладки, и вот что я знаю:

  • Объект JSON не поврежден
  • console.log(i); показывает числа 1-20, как и ожидалось
  • Когда я в конце записываю объект collect, его структура такова: var collect = { i : {text : "the last iteration's text"}};

    Таким образом, инкрементатор "применяет" к data [i] .text и возвращает текстовое значение, но он не делает то, что ожидал, а именно создает новый элемент объекта collect; он просто перезаписывает collect.i 20 раз и оставляет меня с последним значением.

Есть ли другой синтаксис, который мне нужно использовать для назначения членов объекта? Я попытался collect.i.text = и collect[i].text =, и ошибка заключалась в том, что все, что я пробовал, было неопределенным.

Мне бы очень хотелось узнать, что здесь происходит, поэтому чем глубже объяснение, тем лучше.

Спасибо!

Ответы [ 3 ]

2 голосов
/ 13 марта 2010

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

collect = { i : {text : data[i].text}};

Здесь говорится: создайте объект с одним свойством i, значением которого является другой объект с одним свойством text, и назначьте его переменной collect. Вместо этого вы хотите установить свойство существующего объекта collect для каждого значения i, где i - это имя свойства.

Чтобы создать свойство объекта, имя которого задается динамически, вы должны использовать синтаксис в стиле массива, например: collect[i]. Я не думаю, что вы можете смешивать синтаксис массива и синтаксис литерала объекта, как вы пытались. Попробуйте это вместо этого (отказ от ответственности, не тестировался):

collect[i] = { text: data[i]["text"] };

0 голосов
/ 13 марта 2010

Как вы уже знаете, проблема в этой строке:

 collect = { i : {text : data[i].text}};

На каждой итерации цикла вы стираете объект сбора и присваивает ему новый объект в качестве значения. Вот почему в конце он показывает только последнюю итерацию.

Попробуйте это:

 collect[i] = {text : data[i].text};
0 голосов
/ 13 марта 2010
 collect[i] = {text : data[i].text};

Если вы используете collect[i].text, так как collect[i] не существует до назначения, он вернет undefined, у которого нет свойства text.

Также:

  1. collect.i означает collect["i"]. Это полностью отличается от collect[i].
  2. Вы можете использовать массив и добавить с помощью .push.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...