快速嵌套短路物体的方法?

时间:2016-06-22 14:57:17

标签: javascript

例如,我希望在嵌套的对象链的末尾创建一个对象,例如:

    <table id="medicationtable">
    <thead>
    <tr>
        <th data-field="Medication_Name">Medication Name</th>
        <th data-field="Read_Code">Read Code</th>
        <th data-field="Dose">Dose</th>
        <th data-field="Date_Started">Date Started</th>
        <th data-field="Date_Ended">Date Ended</th>
    </tr>
    </thead>
</table>

但我需要检查参数a,b和c是否存在,否则创建它们。 据我所知,你需要这样做:

window.a.b.c.d = {}

是否有更快/更好(“单线程”)的方法?

2 个答案:

答案 0 :(得分:1)

您可以按如下方式编写对象:

window.a = {
    b: {
        c: {
            d: {
            }
        }
    }
};

但是当你想在现有对象上进行此操作时,最好编写一个函数。

示例:

/**
 * Create object(s) in a object.
 * 
 * @param object obj
 * @param array  path
 */
function createObjectPath(obj, path) {

    var currentPath = obj;

    // Iterate objects in path
    for(var i = 0, p; p = path[i]; i++) {

        // Check if doesn't exist the object in current path
        if(typeof currentPath[p] !== 'object') {

            currentPath[p] = {};
        }

        currentPath = currentPath[p];
    }
}

你可以使用这个功能:

createObjectPath(window, ['a', 'b', 'c', 'd']);

该函数在第一个参数中创建一个有争议对象的引用,然后遍历第二个参数中争论的数组中的每个字符串,并将每个字符串设置为父对象中不存在的对象。

答案 1 :(得分:0)

Lodash的set可以单行(忽略导入)完成此操作

import { set } from 'lodash'

set(window, 'a.b.c.d', {})