2011-09-29 36 views
0

包含其它對象我有一個JavaScript對象,看起來像這樣的對象:更合適的方法,以濾除值

var options = { 
    'user1' : { 'house1' : ["lat1", "lng1"] }, 
    'user2' : { 'house2' : ["lat2", "lng2"] }, 
    'user3' : { 'house1' : ["lat3", "lng3"] } 
}; 

說我要查找所有house1關聯的用戶,並返回數組他們的用戶名和他們的位置。

這樣做最清晰和最有效的方法是什麼?

目前,我已經寫了一個相當笨拙的自定義查詢,如下:

function returnByValues(options, housenum): 
    var results = []; 
    for (var username in options) { 
     var properties = options[username]; 
     for (var housekey in properties) { 
      if (housekey === housenum) { 
       var result = {}; 
       result[username] = properties; 
       results.push(result); 
      } 
     } 
    } 
    return results; 

有一個整齊的方法嗎?這不是完全可讀的代碼!

回答

1

我不認爲你需要中間循環,假設每個用戶只與你的例子中的一個房子相關聯。所以:

function returnByValues(options, housenum): 
    var results = []; 
    for (var username in options) { 
     var properties = options[username]; 
     if (housenum in properties) { 
      var result = {}; 
      result[username] = properties; 
      results.push(result); 
     } 
    } 
    return results; 
} 

你不會經常看到if (housenum in properties)語法,但它是if (properties[housenum] != undefined)一個更優雅的等價物。

順便說一句,你的代碼:

result[username] = properties; 

result == {"user1" : { 'house1' : [lat, lng] } } - 是你的意圖?如果你想使用linq.js

result[username] = properties[housenum]; 

result == {"user1" : [lat, lng] }

+0

+1我手動輸入了代碼,它變得和你的功能一樣。關於數組:我錯誤讀了'==='部分。 –

+0

完美地工作 - 感謝'housenum屬性'提示。 – Richard

0
function returnByValues(options, housenum){ 
    var results = []; 
    for (var username in options) 
     if(housenum in options[username]) 
     results.push(function(){ 
      var obj={}; 
      obj[username] = options[username]; 
      return obj; 
     }); 
    return results; 
} 
+0

這是行不通的。對象文字語法中不能使用變量作爲鍵。也就是說,'{username:options [username]}'和'{「username」:options [username]}'是一樣的。 – nnnnnn

0

,你:因爲你你想要什麼的描述是「他們的用戶名和它們的位置的數組」,我會好好待本可以做的事情沿着

function returnByValues(users, house) { 
    return Enumerable.From(users).Where("'" + house + "' in $.Value") 
    .ToObject("$.Key", "$.Value"); 
} 

其中該

線10
var searchResult = returnByValues(options, "house1"); 

/* yields: 
{ 
    "user1": { 
     "house1": ["lat1", "lng1"] 
    }, 
    "user3": { 
     "house1": ["lat3", "lng3"] 
    } 
} 
*/ 

看一看working example on jsFiddle