添加到可能存在或可能不存在的json属性

mcg*_*ilm 13 javascript arrays jquery json

让我说我想这样做:

  var dashboard = {};
  var page = "index";

  $('.check').click(function(){ 
    $(this).toggleClass("active").siblings().slideToggle('slow', function() {
        dashboard['pages'][page][$(this).closest('li').attr("id")]['show'] = $(this).is(":hidden") ? 'collapsed' : 'expanded';
    });
  }
Run Code Online (Sandbox Code Playgroud)

我收到一个错误说:

Dashboard.pages未定义

有没有动态添加pages和后续的孩子,而不必做检查的工作,看看它是否先被定义,然后如果它没有做:

   dashboard['pages'] = {};
Run Code Online (Sandbox Code Playgroud)

因为有时它们可​​能已经存在,我不想首先检查树,我只想根据需要构建分支

编辑 我改变pagename,以page显示该网页的名称会改变,我也想指出的是,该页面可能真的什么太.这个想法是你有任何对象可以包含带参数的对象,而不检查分支是否存在

它看起来像$extend所说的那样只是不确定它是如何工作的.得到我的头脑.

Anu*_*rag 15

定义get和set方法Object.实际上它可以只在dashboard对象上定义,只有它的后代,但这很容易.

Object.prototype.get = function(prop) {
    this[prop] = this[prop] || {};
    return this[prop];
};

Object.prototype.set = function(prop, value) {
    this[prop] = value;
}
Run Code Online (Sandbox Code Playgroud)

使用此get()方法迭代嵌套属性,set()并在必须设置值时调用.

var dashboard = {};

dashboard.get('pages').get('user').set('settings', 'oh crap');
// could also set settings directly without using set()
dashboard.get('pages').get('user').settings = 'oh crap';

console.log(dashboard); //??????????????? {pages: {user: {settings: "oh crap"}}};
Run Code Online (Sandbox Code Playgroud)

您还可以扩展/修改get方法,以将嵌套属性作为单个参数数组字符串接受.使用它,你只需要调用一次:

// get accepts multiple arguments here
dashboard.get('pages', 'user').set('settings', 'something');

// get accepts an array here
dashboard.get(['pages', 'user']).set('settings', 'something');

// no reason why get can't also accept dotted parameters
// note: you don't have to call set(), could directly add the property
dashboard.get('pages.user').settings = 'something';
Run Code Online (Sandbox Code Playgroud)

更新:

由于get方法通常返回一个对象,并且不知道您是否需要数组或其他类型的对象,因此您必须指定自己:

dashboard.get('pages.user').settings = [];
Run Code Online (Sandbox Code Playgroud)

然后你可以将项目推送到设置数组

dashboard.get('pages.user').settings.push('something');
dashboard.get('pages.user').settings.push('something else');
Run Code Online (Sandbox Code Playgroud)

要实际让get函数从给定的字符串(如pages.user)构造对象层次结构,您必须将字符串拆分为多个部分并检查每个嵌套对象是否存在.以下是修改后的版本get:

Object.prototype.get = function(prop) {
    var parts = prop.split('.');
    var obj = this;
    for(var i = 0; i < parts.length; i++) {
        var p = parts[i];
        if(obj[p] === undefined) {
            obj[p] = {};
        }
        obj = obj[p];
    }
    return obj;
}

// example use
var user = dashboard.get('pages.user');
user.settings = [];
user.settings.push('something');
user.settings.push('else');

console.log(dashboard); // {pages: {user: {settings: ["something", "else"] }}}

// can also add to settings directly
dashboard.get('pages.user.settings').push('etc');
Run Code Online (Sandbox Code Playgroud)