<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; JS: безопасное получение вложенного свойства объекта]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=15311</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=15311&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «JS: безопасное получение вложенного свойства объекта».]]></description>
		<lastBuildDate>Sun, 19 Apr 2020 09:14:51 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[JS: безопасное получение вложенного свойства объекта]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=139073#p139073</link>
			<description><![CDATA[<p>Иногда нужно получить свойство объекта на N+1 уровне вложенности, даже если структура не гарантирована.</p><p>Добавляем метод в прототип <br /></p><div class="codebox"><pre><code>
if(!Object.prototype.deep){
    Object.prototype.deep = function(path, defaultValue, src){
        var chunks = path.split(&quot;.&quot;),
            root = src || this,
            i,
            index,
            chunk;
        for(i=0; i&lt; chunks.length;i++){
            chunk = chunks[i];
            if(root.hasOwnProperty(chunk)){
                root = root[chunk];
            } else {
                if(chunk.indexOf(&quot;[&quot;) &gt; -1 &amp;&amp; Object.prototype.toString.call(root) === &#039;[object Array]&#039;){
                    index = parseInt(chunk.replace(&quot;[&quot;,&quot;&quot;).replace(&quot;]&quot;,&quot;&quot;),10);
                    if(root[index] === undefined) {
                        return defaultValue;
                    };
                    root=root[index];
                } else {
                    return defaultValue;
                }
            }
        };
        return root;
    };
};
</code></pre></div><p>Теперь можно получать свойство с возвращением дефолтного значения, если оно не существует<br /></p><div class="codebox"><pre><code>
var object1 = {
	states: [{
		name: &quot;Alyaska&quot;,
		population: {
			year2019: 100500
		}
	}]
};

/* по существующему пути до свойства */
WScript.Echo(object1.deep(&quot;states.[0].population.year2019&quot;), -1); /* -&gt; 100500*/

/* дефолтное значение */
WScript.Echo(object1.deep(&quot;states.[1].population.year2018&quot;),-1); /* -&gt; -1*/
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (sand123)]]></author>
			<pubDate>Sun, 19 Apr 2020 09:14:51 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=139073#p139073</guid>
		</item>
	</channel>
</rss>
