2010-03-26 25 views
11

讓說,我想這樣做添加到JSON的屬性,可能會或可能還不存在

var dasboard = {}; 
    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'; 
    }); 
    } 

我得到一個錯誤說「dashboard.pages未定義」

是有沒有去動態地添加「頁」,如果它被定義第一則遵循不必做檢查,看的工作,如果它不這樣做

dashboard['pages'] = {}; 

,因爲有時他們可能已經存在的孩子,我不想甲肝E要首先檢查該樹我只是想建立分支機構根據需要

編輯 我改「頁面名稱」頁面顯示該網頁的名稱將發生變化,ALO我想指出的是,頁面可能真的是什麼也是。 的想法是,你有任何對象,可以包含帶參數的ojbjecs而不檢查分支是否存在

它看起來像$擴展如上所述將是隻是不知道如何工作的方式。必須讓我的周圍

+0

對不起 - 的腳本對我來說毫無意義。括號索引器的使用意味着需要動態索引對象,但是您使用的是常量。結合「你不想做這項工作」的說法,我想知道你是否知道你正在努力完成什麼。不要試圖貶低 - 只是一個觀察,爲什麼你可能不會得到你正在尋找的答案。 – 2010-03-26 19:14:03

回答

13

定義獲取和設置方法在Object。實際上它可以被定義在dashboard對象上,只有它的後代,但這很容易實現。

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'); 
+0

好吧這看起來像我所要求的除了我沒有使用原型我怎麼會這樣做在jQuery中?我還想讓它更進一步說我想這樣做,所以我有 dashboard.get('pages.user.settings')。push(「something」); dashboard.get('pages.user.settings')。push(「somethingelse」); 這應該給我兩個項目的設置權? – mcgrailm 2010-04-08 15:36:30

+0

@mmcgrail,這是普通的Javascript而不是Prototype框架。獲取每個屬性的第一種方法應該適用於每個瀏覽器(不需要使用jquery)。更新其他查詢的答案。 – Anurag 2010-04-08 17:32:02

+0

太棒了!我從中學到了,謝謝 – mcgrailm 2010-04-09 12:23:08

0

$ .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完成

+0

但這不是動態的,你可以在函數中定義json。我會研究你有的其他建議 – mcgrailm 2010-03-26 19:25:57

+0

不,我正在構建一個只有一個元素並將其合併到數據變量中的對象。它的功能與你的代碼所做的一樣,但是在你的代碼沒有的時候也可以。仍然我很高興你嘗試一種不同的方式:) – naugtur 2010-03-26 21:33:14

0
var foo = dashboard['pages'] || {}; 
foo['pagename'] = 'your thing here'; 
dashboard['pages'] = foo; 

解釋:第一行會檢查第一值爲null,未定義或.. 。假(不要認爲這是一個問題):如果是,創建一個新的對象,如果它不是,將使用它。

1

我不認爲有一個好的內建方式來做到這一點,但你總是可以用一個函數來抽象它。

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

然後使用

getProperty(dashboard,'pages')['pagename']

getProperty(getProperty(dashboard,'pages'),'pagename'); 

如前所述,$ .extend將使這個負擔較輕。

2

我將與三元運算符做到這一點:

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

如果它被設置/ null或不管它會做的伎倆不管。

0

嗯,我想你需要這個:

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

好像你正在處理XML。

0

我的情況下,最好的解決辦法是做一個對象原型

/** 
* 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:'test'}}} 
Object.get(object, 'step1.step2.step3'); // return 'test' 

希望它能幫助:)

相關問題