如何在 JavaScript 中查找另一个对象内具有属性的对象
我有一个包含所有用户的对象,如下所示:
var users = {user1:{}, user2:{}>
,并且每个用户都有一个 isPlaying 属性。如何获取所有 isPlaying 为 false 的用户?
您应该使用
object.keys
,
array.prototype.filter
和
array.prototype.map
:
982966194
如果使用ecma-script 6完成,则可以使用箭头函数进行:
015411182
使用
array.prototype.reduce
正如@ROBG指出的那样,您还可以使用
array.prototype.reduce
。
虽然我不想重叠他的新答案,但我相信
减少
方法如果返回一系列用户对象
不播放<
方法更为实用。 /em>。 )可能需要再次调用
再次执行新操作,而阵列已经准备好调用其他
array.protype
功能,例如
map
,
过滤器
,
foreach
...
代码将以这种方式外观:
576324231
清楚地使用
array.protype.duce
浓缩
MAP
和
过滤器
在单个循环中,在大型数组中,还原应优于“ filter+map” “方法,因为将大型数组循环两次以过滤用户不播放和循环以再次将它们映射到对象可能很重...
摘要:我仍然会使用 filter+filter+map < /em> 降低 当我们谈论几个项目时,因为有时可读性/生产率比优化重要,在我们的情况下,似乎 filter+map 方法需要更少说明(自我文件记录的代码!)而不是减少。
无论如何,可读性/生产力是谁进行实际编码的主观...
遍历您的用户对象:
var list = [];
for (var key in users) {
if (users[key].isPlaying === false) {
list.push(key);
}
}
这将为您提供所有
isPlaying
属性为
false
的用户列表。
如果您想要所有
isPlaying
为 false 的用户对象,您可以添加对象本身:
var list = [];
for (var key in users) {
if (users[key].isPlaying === false) {
list.push(users[key]);
}
}
这也可以使用 Array.prototype.reduce 来实现,这是一个非常全面的工具。它首先获取一个名称数组:
var userNames = Object.keys(users);
要返回一个仅包含用户名的数组,其中 isPlaying 为 false,您可以执行以下操作:
var usersNotPlaying = userNames.reduce(function(names, name) {
if (!users[name].isPlaying) {
names.push(name);
}
return names}, []);
要返回一个以名称为键的 user 对象对象,方法类似:
var usersNotPlaying = userNames.reduce(function(names, name) {
if (!users[name].isPlaying) {
names[name] = users[name];
}
return names}, {});
您也可以以类似的方式使用 forEach ,但是由于它返回 undefined ,因此必须先在外部作用域中初始化收集成员的对象或数组:
var usersNotPlaying = {};
userNames.forEach(function(name) {
if (!users[name].isPlaying) {
usersNotPlaying[name] = users[name];
}
});
您还可以使用 for..in :
var usersNotPlaying = {};
for (var user in users) {
if (users.hasOwnProperty(user) && !users[user].isPlaying) {
usersNotPlaying[user] = users[user];
}
}
以上所有方法都可以返回一个名称数组、用户对象数组或用户对象对象。选择适合的。 ;-)