通过索引从另一个数组返回对象数据

时间:2019-05-22 21:55:21

标签: javascript

如果索引与另一个数组匹配,从数组返回数据的最佳方法是什么?

我有一个用户集合:

Collection [Map] {
 '531592097837613058' => {}
 '460281004972572672' => {}
}

并且我有允许ID的数组:

const allowedRoles = ['523928765865394211'];

我要实现的是返回集合的对象,该对象的索引与AllowedRoles中的某些索引匹配。从理论上讲,这很简单,但是我误解了收集方法。

3 个答案:

答案 0 :(得分:0)

如果您有一个用户地图(即userMap)和一个要过滤用户的allowedRoles数组,那么一种简单的获取新用户集合的方法就是到:

  1. 迭代userMap
  2. 的键/值条目
  3. 如果当前输入键存在于allowedRoles数组中,请在结果数组中包含用户值

这可以表示为:

const userMap = {
 '531592097837613058' : { user : "bob" },
 '460281004972572672' : { user : "bill" },
 '124' : { user : "joe" },
 '523928765865394211' : { user : "sam" }
}

const allowedRoles = ['523928765865394211', '124'];


const allowedUsers = [];

/* Iterate entries of user map */
for(const [key, value] of Object.entries(userMap)) {
  
  /* If key of user map present in allowed roles, add the value (user)
  to allowed users */
  if(allowedRoles.indexOf(key) !== -1) {
    allowedUsers.push(value);
  }
}

console.log(allowedUsers);

答案 1 :(得分:0)

假设users是您的用户ID字典/地图,有两种方法可以完成您想要的操作:

// The functional way    
result = allowedRoles.map(id => users[id]).filter(userData => userData != undefined)

// With loops
result = []
for(id of allowedRoles) {
    if(users[id] != undefined) result.push(users[id])
}

答案 2 :(得分:0)

如果您知道allowedRoles中的所有ID都存在于Collection中,则可以映射到allowedRoles并进行查找。如果allowedRoles中可能存在其他ID,请先将其过滤掉:

let Collection = new Map ([
  ['531592097837613058', {name: "Fred"}],
  ['523928765865394211', {name: "Barney"}]
]);
 
 const allowedRoles = ['523928765865394211'];

 let roles = allowedRoles
             //.filter(item => Collection.has(item)) // if you need it
             .map(item => Collection.get(item))

 console.log(roles)

由于Map查找是恒定时间,因此应为O(n),其中n是allowedRoles的长度