簡體   English   中英

循環遍歷對象數組以查找具有匹配屬性的對象

[英]Loop through array of objects to find object with matching property

我有一個數組,一個包含所有具有唯一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
 } 

你必須循環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];

在ECMAScript 6中,您可以使用本機Array.find方法

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

看到目前只有最新的Firefox支持這一點,你可以使用像underscore.js這樣的庫:

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

...或者您可以使用稍微不那么新的forEach方法的包裝器:

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;
  }
};

看看Underscore.js來輕視這個,就像這樣:

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

你自然可以傳入一個變量來匹配:

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

您可以循環遍歷數組以匹配:

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; });

如果你必須使用現有的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];

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

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

  return !hasDifferentKeyValues;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM