2014-02-12 34 views
3

我有一個代表用戶,像這樣的JavaScript對象的數組:清潔方法規範化JavaScript對象屬性

[ 
    { userName: "Michael", 
    city: "Boston" 
    }, 
    { userName: "Thomas", 
    state: "California", 
    phone: "555-5555" 
    }, 
    { userName: "Kathrine", 
    phone: "444-4444" 
    } 
] 

某些對象包含一些屬性,但不是別人。我需要的是一種乾淨的方式來確保所有對象獲得相同的屬性。如果它們不存在,我希望他們有一個空字符串值,就像這樣:

[ 
    { userName: "Michael", 
     city: "Boston", 
     state: "", 
     phone: "" 
    }, 
    { userName: "Thomas", 
     city: "", 
     state: "California", 
     phone: "555-5555" 
    }, 
    { userName: "Kathrine", 
     city: "", 
     state: "", 
     phone: "444-4444" 
    } 
] 

更新 我本來應該更具體一點。我正在尋找可以動態處理這種情況的選項,因此我不必提前知道屬性。

對於特定的jQuery,$.extend()選項是一個不錯的選擇,但只有在您提前知道所有屬性的情況下才有效。

有幾個人提到,這應該可能是服務器端的任務,雖然我通常贊同這一點,但我沒有在服務器端處理這個問題有兩個原因:1)它將是一個更小的JSON對象如果900個1000個對象只包含1個可能的9個屬性。 2)需要添加「空」屬性以滿足JS實用程序的需要,該實用程序可以在將來會被某些不關心某些屬性丟失的東西替換。

+2

你做出了嘗試? – megawac

+1

+1實際嘗試任何東西,但也...爲什麼你不能在檢索時清理數據? – PlantTheIdea

+1

任何繼承人建議如何去做這件事:在你的項目上做一個期望屬性的默認對象:'{user:「」,city:「」,...}'然後調用'$ .map'並且擴展每個項目都有默認值 – megawac

回答

3

由於您使用jQuery你可以濫用$.extend

function Person(options){ 
    return $.extend({ 
     userName:"", 
     city: "", 
     state:"", 
     phone: "" 
    },options); 
} 

$.map([{}],Person) 

更新

繼承人的方式具有動態默認屬性

function mapDefaults(arr){ 
    var defaultProperties = {} 
    for(var i =0; i < arr.length; i++){ 
     $.each(arr[i],function(key){ 
      defaultProperties[key] = ""; 
     }); 
    } 
    function Defaulter(obj){ 
     return $.extend({},defaultProperties,obj); 
    } 
    return $.map(arr, Defaulter); 
} 

mapDefaults([{a:"valA"},{b:"valB"}]); 
/* produces: 
[{a:"valA",b:""},{a:"",b:"valB"}] 
*/ 
1
var list = [ 
    { userName: "Michael", 
    city: "Boston" 
    }, 
    { userName: "Thomas", 
    state: "California", 
    phone: "555-5555" 
    }, 
    { userName: "Kathrine", 
    phone: "444-4444" 
    } 
]; 


for(var i = 0; i < list.length; i++){ 
    if(list[i].state === undefined) 
     list[i].state = ""; 
    if(list[i].phone === undefined) 
     list[i].phone = ""; 
}; 
console.log(list); 

http://jsfiddle.net/g5XPk/1/

2

的東西,你可以嘗試創造一個凝聚功能:

function coalesceValues(val){ 
    switch(val) 
     case undefined: 
     case null: 
      return ''; 
      break; 
     default: 
      return val; 
      break; 
    } 
} 

或者,如果你想放棄的定製爲了簡單:

function coalesceValues(val){ 
    return val || ''; 
} 

,然後應用它分配變量時:

var city = coalesceValues(obj.city); 

這樣,你不需要做任何瘋狂的擊穿陣列和循環或任何東西,你可以把它應用到任何你想要的,你也可以自定義要合併的值。

只是提供一個替代的想法。

0

這大概應該是一個服務器端的任務,但..

如果你知道所有可能的屬性提前,你可以這樣做:

http://jsfiddle.net/BMau9/

var properties = ['userName', 'city', 'state', 'phone']; 

var data = [{ 
    userName: "Michael", 
    city: "Boston" 
}, { 
    userName: "Thomas", 
    state: "California", 
    phone: "555-5555" 
}, { 
    userName: "Kathrine", 
    phone: "444-4444" 
}]; 

for (var i in data) { 
    for (var j in properties) { 
     data[i][properties[j]] = data[i][properties[j]] || ''; 
    } 
} 
2

的最容易理解的方法可能是創建一個接受對象並使用if語句作爲存在檢查的函數,如果它沒有找到它,則分配一個默認值。

function normalize(object) { 
    if(typeof object.userName === 'undefined') { 
    object.userName = 'Default Value'; 
    } 
    if(typeof object.city === 'undefined') { 
    object.city = 'Default Value'; 
    } 
    if(typeof object.state === 'undefined') { 
    object.state = 'Default Value'; 
    } 
    if(typeof object.phone === 'undefined') { 
    object.phone = 'Default Value'; 
    } 

    return object; 

} 

var userArray = [{},{},{}].map(normalize); 

我們也可以去構造函數路由並提供對象創建的默認值。

function User (data) { 
    this.userName = data.userName || 'Default Value'; 
    this.city = data.city || 'Default Value'; 
    this.state = data.state || 'Default Value'; 
    this.phone = data.phone || 'Default Value'; 

return this; 
} 

var userArray = [{},{},{}].map(function(o){ 
return new User(o); 
}); 

當然,這依賴於一個特定類型的數據並不會擴展到其他的屬性,不是很乾,但正如我所說,這可能是最容易從初學者的角度看明白。

0

Fiddle 此功能將把獨特的對象鍵在一個數組中,所以你可以運行你的ar通過它的對象的射線,然後使用附帶的其它答案的一個鍵添加到對象,如果它們不存在:

function uniqueKeys(){ 
    var keys=[]; 
    function getUniqueKeys(){ 
     return keys 
    } 
    function addObject(obj){ 
     for (var k in obj){ 
      keys = _.union(keys,[k]); 
     } 
    } 
    return { 
     addObj: addObject, 
     getKeys: getUniqueKeys 
    } 
} 

用法:

var objArr = [{ userName: "Michael", city: "Boston" }, 
{ userName: "Thomas", state: "California", phone: "555-5555"}, 
{ userName: "Kathrine",phone: "444-4444" }]; 

var uniq = new uniqueKeys(); 
_.each(objArr, function(v){ 
    uniq.addObj(v) 
}); 
var keys = uniq.getKeys(); 
alert(keys);