1 (изменено: DnsIs, 2013-06-24 14:30:40)

Тема: JS: Правильная проверка существования значения массива

Доброго утра.

o = {
    "value": {
        "origin": {
            "title": "Ух ты",
            "htmlUrl": "http://xxx.ru",
        }
    }
}

Проверки типа того

d = o.value.body.title ? o.value.body.title : "oh my god"
d = o.value.body.title || "oh my god"

Не работают. Пока вижу только такой вариант:

d = o.value.origin ? o.value.origin.title ? o.value.origin.title : "no" : "no";

Но при большой вложенности получится очень некрасиво.
Как правильно проверить, без длинной городьбы?

Спасибо.

Нас невозможно сбить с пути, нам пофигу куда идти.

2

Re: JS: Правильная проверка существования значения массива

Как правильно проверить, без длинной городьбы?

Не получится. Надо каждый раз проверять наличие родительского свойства в цепочке "a.b.c.d".

Можно пройтись циклом "for in".

( 2 * b ) || ! ( 2 * b )

3 (изменено: wisgest, 2013-06-24 16:26:35)

Re: JS: Правильная проверка существования значения массива

Если понял, что надо:

try {
    d = o.value.origin.title;
} catch (error) {
    d = "no";
}

4

Re: JS: Правильная проверка существования значения массива

Можно. Но через исключение больше похоже смахивает на хак.

( 2 * b ) || ! ( 2 * b )

5

Re: JS: Правильная проверка существования значения массива

И "for in" и "try catch" пробовал, но хотелось что бы был более простой метод.

Спасибо.

Нас невозможно сбить с пути, нам пофигу куда идти.

6

Re: JS: Правильная проверка существования значения массива

Нашел решение

d = (o.value && o.value.origin && o.valuee.origin.title) || "Пусто"

Которое позже трансформировалось в

d = ((s1 = o.value) && (s2 = s1.origin) && (s2.title)) || "Пусто"
Нас невозможно сбить с пути, нам пофигу куда идти.

7

Re: JS: Правильная проверка существования значения массива

Конечный результат:

function f (o, s) {
    s = s.split('.');
    for (i = 0; i < s.length; i++) {
            o = o[s[i]] || "";
        }
    return o
}
d = f (o, "value.origin.title");
Нас невозможно сбить с пути, нам пофигу куда идти.

8 (изменено: Rumata, 2013-06-25 12:17:14)

Re: JS: Правильная проверка существования значения массива

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


(function(that)
{
    Object.ns = function(namespace, value)
    {
        var parts = namespace.split('.');
        var name = parts.pop();
        var len = parts.length;

        var root = that;

        for (var i = 0; i < len; i++) {
            var p = parts[i];
            root = root[p] = root[p] || {};
        }

        return root[name] = value;
    };

})(this);

Пример использования:


Object.ns('a.b.c.d', Math.PI);
Object.ns('a.x.y.z', Math.PI);

/*
// The code above creates this structure
var a = {
    b: {
        c: {
            d: Math.PI
        }
    }, 
    x: {
        y: {
            z: Math.PI
        }
    }
};
*/
( 2 * b ) || ! ( 2 * b )