Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Число свойств в объекте и избавление от паравозов (https://javascript.ru/forum/misc/26670-chislo-svojjstv-v-obekte-i-izbavlenie-ot-paravozov.html)

kidar2 17.03.2012 16:07

Число свойств в объекте и избавление от паравозов
 
Добрый день.
Есть два небольших вопроса:

1. Как можно узнать число свойств и методов в js объекте? Как собственных, так и тех которые идут в прототипах. Только чтобы без цикла for in по этому объекту.

2. Есть некоторый объект, у него есть вложенные свойства:
a.b.c.d.e

Как можно компактно и быстро получить значение свойства "e", если может быть пустым любой из "вагонов" этого паровоза, причём длина паровоза может быть произвольной.

Кто нибудь решал эту задачу, кроме прохода по вагонам циклом, рекурсией или банальным try catch ?

monolithed 17.03.2012 16:40

Цитата:

Сообщение от kidar2
Только чтобы без цикла for in по этому объекту.

никак

karmis 17.03.2012 17:17

1)
http://jquery-docs.ru/Core/size/

2)
сам мучаюсь. Сделал сначала replace всех пустых, затем просто find
$(document).find('table');

monolithed 17.03.2012 17:53

Если нужно подсчитать количество всех дочерних элементов, то сперва определите родительский элемент, затем обойдите рекурсивно все ноды с помощью методов childNodes или children[]

kidar2 17.03.2012 19:10

Речь не про dom дерево.
Речь про произвольный js объект, например такой
a = {a: 123, b : 321 }

DreamTheater 17.03.2012 19:14

Цитата:

Сообщение от kidar2 (Сообщение 163686)
Речь не про dom дерево.
Речь про произвольный js объект, например такой
a = {a: 123, b : 321 }

var object = {
    a: 1,
    b: 2,
    c: 3,
    d: 4,
    e: 5,
    f: 6,
    g: 7,
    h: 8,
    i: 9,
    j: 10
};

alert(Object.keys(object).length);

monolithed 17.03.2012 19:17

DreamTheater,
вложенные ветки все равно рекурсивно обходить придется

DreamTheater 17.03.2012 19:51

Цитата:

Сообщение от monolithed (Сообщение 163689)
DreamTheater,
вложенные ветки все равно рекурсивно обходить придется

Ошибся, ему ведь нужно считать свойства объекта и его прототипа, то есть нужно юзать getOwnPropertyNames вместо keys, а про вложенность он ничего не говорил.

kidar2 17.03.2012 20:08

Спасибо. То что нужно.
Ещё бы вторую задачу решить :)

kidar2 17.03.2012 20:39

Object.getOwnPropertyNames, Object.keys - оказывается этих методов нет в IE8-. Печально.

monolithed 17.03.2012 21:02

Цитата:

Сообщение от kidar2
2. Есть некоторый объект, у него есть вложенные свойства:
a.b.c.d.e

Как можно компактно и быстро получить значение свойства "e"

Исходя из этого, структура объекта должна быть такая:
var object = {
    a: {
        b: {
           c: {
               d: {
                   e: 1
               }
           } 
       }
    }
};


Что в этой нотации a.b.c.d.e не устраивает? ;)

kidar2 18.03.2012 12:39

Длина паровоза может быть произвольной, a.b.c.d.e лишь пример, может ещё длиннее: a.b.c.e.f.q.w.e.e.r.t, длина заранее неизвестна.
Хочется какой-то метод getPropretyValue(a,"b.c.d.e.") который вернёт undefined если какогото вагона нету в этой цепочке.

vasa_c 18.03.2012 13:25

return a && a.b && a.b.c && a.b.c.d;

:)

nikita.mmf 18.03.2012 22:44

function resolve ( obj, lookups ) {
	var curr = obj, 
		items = lookups.split("."),
		i = 0, 
		len = items.length;
	for ( ; i < len; i++ ) {
		curr = curr[ items[ i ] ];
		if ( typeof curr != 'object' ) break;
	}
	return curr;
}
alert( 
	resolve({a: {b: {c: {d: {e: { f: 1 }}}}}}, "a.b.c.d.e.f") + "\n" + 
	resolve({a: {b: {c: {d: {e: { f: 1 }}}}}}, "q.w.e.r.t.y") 
);


Часовой пояс GMT +3, время: 23:15.