Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 添加到可能存在或可能不存在的json属性_Javascript_Jquery_Arrays_Json - Fatal编程技术网

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

Javascript 添加到可能存在或可能不存在的json属性,javascript,jquery,arrays,json,Javascript,Jquery,Arrays,Json,假设我想这样做: var仪表板={}; var page=“index”; $('.check')。单击(函数(){ $(this).toggleClass(“active”).sides().slideToggle('slow',function()){ 仪表板['pages'][pages][$(this).closest('li').attr(“id”)]['show']=$(this).is(“:hidden”)?“collapsed':“expanded”; }); } 我得到一个错

假设我想这样做:

var仪表板={};
var page=“index”;
$('.check')。单击(函数(){
$(this).toggleClass(“active”).sides().slideToggle('slow',function()){
仪表板['pages'][pages][$(this).closest('li').attr(“id”)]['show']=$(this).is(“:hidden”)?“collapsed':“expanded”;
});
}
我得到一个错误,说:

Dashboard.pages未定义

是否可以动态添加
页面
和随后的子项,而不必先检查是否定义了,然后再检查是否没有:

dashboard['pages']={};
因为有时它们可能已经存在,我不想先检查树,我只想根据需要构建分支

编辑 我将
pagename
更改为
page
,以显示页面名称将发生更改,并且我想指出页面也可能是任何东西。 其思想是,任何对象都可以包含带有参数的对象,而无需检查分支是否存在


看起来,如上所述,
$extend
将是一条路要走,只是不确定它是如何工作的。我得想一想。

$。extend是一条路要走

function elem(a,b){
var r={'pages':{'pagename':{}}};
r.pages.pagename[a]={'show':b};
return r;
}
data={};
//inside the event handler or something:
data = $.extend(true,data,elem($(this).closest('li').attr("id"),$(this).is(":hidden") ? 'collapsed' : 'expanded'));
但老实说,无论如何,存储这些信息是一个相当混乱的想法。 我敢打赌,如果您以后需要这些信息,可以使用一个好的选择器或jQuery.data()来完成


解释:第一行将检查第一个值是否为null、未定义或…false(不要认为这是一个问题):如果是,创建一个新对象,如果不是,将使用它。

我认为没有一个好的内置方法来实现这一点,但您可以始终使用函数对其进行抽象

function getProperty(obj,prop){
    if( typeof( obj[prop] ) == 'undefined' ){
        obj[prop] = {};
    }
    return obj[prop];
}
然后你用

getProperty(仪表板,'pages')['pagename']


如前所述,$.extend将减轻此操作的负担。

我将使用三元运算符:

dashboard['pages'][page] = dashboard['pages'][page] ? dashboard['pages'][page] : {};

不管它是set/null还是其他什么,这都能起作用。

对象上定义get和set方法。实际上,它可以仅在
仪表板上定义,也可以仅在其子对象上定义,但这很容易做到

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

Object.prototype.set = function(prop, value) {
    this[prop] = value;
}
使用此
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"}}};
您还可以扩展/修改
get
方法,将嵌套属性作为单个参数或数组或字符串接受。使用该方法,您只需调用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';
更新

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

dashboard.get('pages.user').settings = [];
然后,您可以将项目按如下方式推送到设置数组中:

dashboard.get('pages.user').settings.push('something');
dashboard.get('pages.user').settings.push('something else');
要让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');
Object.prototype.get=函数(prop){
变量部分=项目拆分('.');
var obj=这个;
对于(变量i=0;i
我想你需要这个:

var dashBoard = new Array();
if(!dashboard['page123']) {
    dashBoard.push('page123');
} else {
...do what you want
}

似乎您正在处理XML。

对于我的案例来说,最好的解决方案是做一个对象原型

 /**
 * OBJECT GET
 * Used to get an object property securely
 * @param object
 * @param property
 * @returns {*}
 */
Object.get = function(object, property) {
    var properties = property.split('.');
    for (var i = 0; i < properties.length; i++) {
        if (object && object[properties[i]]) {
            object = object[properties[i]];
        }
        else {
            return null;
        }
    }
    return object;
};

希望有帮助:)

如果使用下划线>=1.9.0,则可以使用和:


对不起,这个剧本对我来说毫无意义。使用括号索引器意味着需要动态索引对象,但您使用的是常量。再加上你“不想做这项工作”的说法,我想知道你是否知道你想要完成什么。不是试图诋毁-只是观察一下为什么你可能得不到你想要的答案。这里有更好的ES6解决方案。但在函数中定义json并不是动态的。我将研究您提出的其他建议没有,我正在构建一个只有一个元素的对象,并将其合并到数据变量中。如果代码有效,它会执行与代码相同的操作,但如果代码无效,它也会执行。不过我还是很高兴您尝试了另一种方式:)好的,这看起来像我所要求的,只是我没有使用原型,在jquery中我该怎么做?另外,让我更进一步,让我们假设我想这样做,所以我有dashboard.get('pages.user.settings')。push('something');dashboard.get('pages.user.settings').push(“somethingelse”);设置中应该有两项,对吗?@mmcgrail,这是常规Javascript,不是原型框架。获取每个属性的第一种方法应该适用于每个浏览器(不需要jquery)。正在更新其他查询的答案。
var dashBoard = new Array();
if(!dashboard['page123']) {
    dashBoard.push('page123');
} else {
...do what you want
}
 /**
 * OBJECT GET
 * Used to get an object property securely
 * @param object
 * @param property
 * @returns {*}
 */
Object.get = function(object, property) {
    var properties = property.split('.');
    for (var i = 0; i < properties.length; i++) {
        if (object && object[properties[i]]) {
            object = object[properties[i]];
        }
        else {
            return null;
        }
    }
    return object;
};
var object = { step1: { step2: { step3: ['value1', 'value2'] }}}
Object.get(object, 'step1.step2.step3'); // ['value1', 'value2']
Object.get(object, 'step1.step2.step3.0'); // 'value1'
Object.get(object, 'step1.step2.step3.step4'); // null
d={a: {b: "c"}}
_.property(["a", "b", "c", "e"])(d)   // undefined
_.property(["a", "b"])(d)             // "c"
_.propertyOf(d)(["a", "b", "c", "e"]) // undefined
_.propertyOf(d)(["a", "b"])           // "c"