2014-01-29 159 views
7

我有1個數組,其中一個列表中包含具有唯一ID的所有用戶列表。我有一個包含選定組信息的對象。部分信息是業主ID。我試圖弄清楚,如何根據組所有者ID獲取用戶的信息?例如,學生組對象的所有者ID爲70,我的網站上有一位ID爲70的用戶...我如何匹配它們?循環遍歷對象數組以查找具有匹配屬性的對象

users: 
[ { 
id: 68 
name: mike 
domain: i:0#.f|admembers|mike.ca 
email: mike.ca 
isAdmin: False 
}, etc etc ] 

selectedGroup: { 
name: Students 
id: 78 
description: 
owner: 70 
ownerIsUser: True 
} 

回答

18

你會通過users必須循環:

var i = users.length, 
    ownerData; 

while(i--) { 
    if(selectedGroup.owner == users[i].id) { 
     ownerData = users[i]; 
     break; 
    } 
} 

或者你可以使用Array.filter()

var ownerData = users.filter(function(user) { 
    return user.id === selectedGroup.owner; 
})[0]; 
+0

var i = users.length,ownerData;我從來沒有見過這樣的事情。什麼是「我」? – Batman

+1

這是一種快速循環數組的方式 - 'i'初始化爲'users'數組的長度,並在下面的while循環中遞減。當'i'達到0時,循環執行最後的時間並結束。它以相反的順序遍歷數組。 –

+2

我瞭解索引部分,而不是ownerData部分。不應該像var i = x.length一樣單獨聲明; var ownerData; – Batman

3

看一看Underscore.js輕視這一點,就像這樣:

_.findWhere(users, { id: 68 }) 

Naturally你可以傳遞的一個變量匹配諸如:

_.findWhere(users, { id: selectedGroup.owner }) 
+0

包含一個實用程序功能庫的錯誤形式。也許看看Underscore的'findWhere'實現並複製出來。 –

+0

我會建議把Underscore圖書館作爲評論的一個更廣泛的視角,因爲它可能還有更多的收穫,但我還沒有能夠對問題發表評論。 – swornabsent

1

你可以只在陣列上環,以匹配:

var match = function (array, matchfn) { 
    var i; 
    for (i in array) { 
     if (matchfn(array[i])) { 
      return array[i]; 
     } 
    } 
}; 

var user = match(users, function (u) { return u.id == 70; }); 
6

在ECMAScript中6,你可以使用本地Array.find method

var selectedUser = users.find(function(user){ 
    return user.id === 70; 
}); 

鑑於目前只有最新的Firefox支持此功能,您可以使用庫如underscore.js

var selectedUser = _.find(users, function(user){ 
    return user.id === 70; 
}); 

...或者你可以使用一個包裝圍繞較遠近期forEach method略:

var selectedUser; 

users.forEach(function(user){ 
    if(user.id === 70){ 
    selectedUser = user; 
    } 
}); 

但是,如果你想使用腳本將支持舊版瀏覽器,而無需使用庫,你需要一個for循環:

var selectedUser; 

for(var i = 0; i < users.length; i++){ 
    if(users[ i ].id === 70){ 
    selectedUser = users[ i ]; 

    break; 
    } 
}; 
1

如果您有與現有的JavaScript對象的工作,我覺得蠻力解決方案是唯一的選擇:

var owner; 
for(var i = 0; i < users.length; i++) { 
    if (users[i].id == selectedGroup.id) { 
     owner = users[i]; 
     break; 
    }   
} 

if (owner) { 
    console.log(owner); 
} 

取決於你如何使用它,它可能是更有效的調整你的第一個對象,所以你可以直接訪問屬性:

var users = { 
    "68": { 
     id: 68, 
     name: 'mike', 
     domain: 'i: 0#.f | admembers | mike.ca', 
     email: 'mike.ca', 
     isAdmin: false 
    } 
}; 

var selectedGroup = { 
    name: 'Students', 
    id: 78, 
    description: '', 
    owner: 68, 
    ownerIsUser: 'True' 
}; 

var owner = users[selectedGroup.owner]; 
+0

神聖的廢話......我真的很喜歡將數組重構爲對象的想法。這可能需要我重寫我的服務,但稍後可能會使事情變得更簡單。 – Batman

+0

我想重組對象已選中,但我不知道如何從循環創建一個新的屬性。這是我嘗試過的:http://jsfiddle.net/pGsc6/ – Batman

+0

請試試這個:http://jsfiddle.net/CJRUm/ –

0

您還可以使用Array.prototype.some比較所有的對象屬性來查看它們是否包含相等的值。

function haveSameValues(oneObject, anotherObject) { 
    var hasDifferentKeyValues = Object.keys(oneObject).some(function(key){ 
    return oneObject[key] !== anotherObject[key] 
    }); 

    return !hasDifferentKeyValues; 
}