如何在JavaScript中找到具有另一个对象内部属性的对象
How do I find objects with a property inside another object in JavaScript
我有一个包含所有用户的对象,如:var users = {user1:{}, user2:{}}
,并且每个用户都有一个isPlaying属性。如何让所有用户的isPlaying为假?
您应该使用Object.keys
, Array.prototype.filter
和Array.prototype.map
:
// This will turn users object properties into a string array
// of user names
var userNames = Object.keys(users);
// #1 You need to filter which users aren't playing. So, you
// filter accessing users object by user name and you check that
// user.isPlaying is false
//
// #2 Using Array.prototype.map, you turn user names into user objects
// by projecting each user name into the user object!
var usersNotPlaying = userNames.filter(function(userName) {
return !users[userName].isPlaying;
}).map(function(userName) {
return users[userName];
});
如果要使用ECMA-Script 6完成,则可以使用箭头函数:
// Compact and nicer!
var usersNotPlaying = Object.keys(users)
.filter(userName => users[userName].isPlaying)
.map(userName => users[userName]);
使用Array.prototype.reduce
正如@RobG所指出的,你也可以使用Array.prototype.reduce
。
虽然我不想重叠他的新的和自己的答案,我相信reduce
方法更实用,如果它返回一个数组的用户对象不播放。
基本上,如果你返回一个对象而不是一个数组,问题是另一个调用者(即调用所谓的reduce
的函数)可能需要再次调用reduce
来执行新的操作,而数组已经准备好流畅地调用其他Array.prototype
函数,如map
, filter
, forEach
…
代码应该是这样的:
// #1 We turn user properties into an array of property names
// #2 Then we call "reduce" on the user property name array. Reduce
// takes a callback that will be called for every array item and it receives
// the array reference given as second parameter of "reduce" after
// the callback.
// #3 If the user is not playing, we add the user object to the resulting array
// #4 Finally, "reduce" returns the array that was passed as second argument
// and contains user objects not playing ;)
var usersNotPlaying = Object.keys(users).reduce(function (result, userName) {
if (!users[userName].isPlaying)
result.push(users[userName]);
return result;
}, []); // <-- [] is the new array which will accumulate each user not playing
显然,使用Array.prototype.reduce
将map
和filter
集中在单个循环中,并且在大型数组中,减少应该优于"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}, []);
返回一个用户对象的对象,它们的名字作为键,类似:
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];
}
});
在:
中也可以用代替…var usersNotPlaying = {};
for (var user in users) {
if (users.hasOwnProperty(user) && !users[user].isPlaying) {
usersNotPlaying[user] = users[user];
}
}
以上所有方法都可以返回一个名称数组、用户对象数组或用户对象的对象。选择合适的。: -)
请尝试下面的JS代码:设置所有的isPlaying为false。
var json_object={};//{"user1":{"isPlaying":"false"},"user2":{"isPlaying":"ture"}};
json_object['user1']={"isPlaying":"false"};
json_object['user2']={"isPlaying":"ture"};
console.log(json_object);
for(var key in json_object){
if(json_object[key].isPlaying === "false"){/*do what you want*/}
}
console.log(json_object);
- 如果使用 lodash 将属性存在于另一个对象中,则向对象添加属性
- Javascript(Angular)从一个对象数组到第二个数组查找值
- 访问JSON对象内部的数组元素
- Javascript OOP-从函数返回一个值;s在对象内部's方法(嵌套函数)
- 将对象内部的参数包装给函数是一个坏主意吗?
- 为什么这个内部对象文字等于另一个对象
- JS:我如何访问一个函数内的变量值,而另一个函数内部的变量值,并且两个函数属于同一个对象
- JavaScript - 尝试从另一个对象内部访问一个对象方法,得到未定义的错误
- 当一个“;得到“;函数出现在对象内部
- 在IE8中初始化另一个对象内部的对象失败
- 使用Undercore在另一个对象内部修改对象内部的数组
- 如何获取位于另一个对象内部的对象的名称
- 使用一个对象数组作为主干模型内部的属性
- 试图打印一个位于Javascript对象内部的url
- 余烬数据-在一个对象内部分配一个值
- 如何在JavaScript中找到具有另一个对象内部属性的对象
- 将参数从Javascript对象内部传递给另一个函数
- 在foreach内部创建一个对象
- 什么是对象内部的下一个(){}
- 一个对象在另一个对象内部的初始化