2012-02-02 8 views
4

У меня есть список объектов, все названные таким образом:Javascript: Петля через неизвестное число литералов объектов

var p1 = {}; 
var p2 = {}; 
p1.name = "john"; 
p1.hobby = "collects stamps"; 
p2.name = "jane"; 
p2.hobby = "collects antiques"; 

Я знаю, как цикл через p1 и p2, чтобы собрать свойства, при условии, что я знаю, сколько из этих p объектов литералы есть. Вот моя проблема, я не всегда знаю, сколько из этих литературных объектов p будет там. Иногда он поднимается до p2, иногда он поднимается до p20.

Есть ли способ перебрать объекты, если я знаю, что все они имеют один и тот же префикс?

Редактировать: Я не могу изменить способ получения списка объектов. Это дано мне в этом формате ...

+0

Просто поместите их в массив. –

ответ

5

Если мы сделаем следующие предположения:

  • Объектами являются глобальными
  • Номерные суффиксы являются последовательными

... то следующие работы:

for (var i = 1; window["p" + i] !== undefined; i++) { 
    console.log(window["p" + i]); // loop over each object here 
} 
+0

, так что в основном проверьте для p #, чтобы узнать, не определено ли это, и если это не так, читать свойства p #, и если он не определен, я могу остановиться? позвольте мне проверить это и вернуться к вам. Спасибо. – newbieProgrammer

+0

@newbieProgrammer - Да. –

+0

Gasp ... Я отправил свой ответ слишком поздно ... – JScoobyCed

0

Почему бы вам просто не сохранить их все в одном литеральном объекте верхнего уровня? Это облегчит перечисление через них.

EG:

var MyObj = { 
    p1: {}, 
    p2: {} 
}; 

и т.д ..

[править]

Если они местные вары, вы не можете изменить формат этих данных, возможно, придется использовать Eval. Не стреляйте меня:

var p1 = {}; 
var p2 = {}; 
p1.name = "john"; 
p1.hobby = "collects stamps"; 
p2.name = "jane"; 
p2.hobby = "collects antiques"; 

var found = true, c = 1; 

while(found) { 
    try { 
     var obj = eval('p' + c); 
     c++; 
     console.log(obj); 
    } catch(e){ 
     found = false; 
    } 
} 

Я не предлагаю использовать это, я предлагаю изменить формат данных, которые вы получаете, но это один из возможных решений.

+0

Я не могу контролировать, как я получаю список объектов. Таким образом, чтобы хранить их все в одном литеральном объекте верхнего уровня, требуется некоторая утонченность, так как я должен читать во входных данных, а затем переформатировать, прежде чем перебирать их. Если это единственный способ, я сделаю это. – newbieProgrammer

+0

Как именно вы получаете список объектов? В какой области вы их принимаете? – badsyntax

+0

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

2

Вы должны иметь их в массиве, на который ссылается одна переменная.

var p = []; 
p.push({ 
    name:"john", 
    hobby:"collects stamps" 
}, { 
    name:"jane", 
    hobby:"collects antiques" 
}); 

Тогда вы бы цикл массива, и перечислять каждый объект ...

for(var i = 0; i < p.length; i++) { 
    for(var n in p[i]) { 
     console.log(p[i][n]); 
    } 
} 

EDIT:

кажется из комментария, что это может быть прибывая как индивидуальная переменная.

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

var obj; 

for(var i = 1; obj = window['p' + i]; i++) { 
    if(typeof obj === 'object') { 
     for(var n in obj) { 
      console.log(obj[n]); 
     } 
    } 
} 

Этот цикл будет работать до тех пор, через p(n) глобальных возвращает значение falsey.

До тех пор, пока истинное значение найдено, а его typeof - 'object', вы будете перебирать этот объект.

+0

Хорошо. Мне нравится, где это происходит. Поэтому предположим, что я не контролирую, как данные передаются мне. Как я нажимаю неизвестное количество объектов в один массив? – newbieProgrammer

+0

@newbieProgrammer: Как данные, данные в настоящее время? Вы говорите, что объекты добавляются в скрипт как отдельные переменные 'p1',' p2' и т. Д.? Если это так, это немного по-другому. –

+0

Да, вы совершенно правы. Данные, данные мне, являются отдельными объектными литералами p #. – newbieProgrammer

0

Если у вас есть все ваши данные, хранящиеся в переменной или несколько переменных, вы можете к массиву.

var data = "....JSON"; 
var a = []; 
a.push(data); 

Push продолжает добавлять материал в массив в основном смысле. Вы также можете нажать, чтобы удалить последние нажатые данные.

Посмотрите на другие методы здесь:

http://www.w3schools.com/jsref/jsref_obj_array.asp

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array

Смежные вопросы