我想循环浏览此对象并添加' loc'如果他们的方面= 2,则为数组的值。我做错了什么?
2025是房间的对象,整个房间都是房间。
//Object
{
"2025": {
"tom": {
"side": 1,
"loc": 111
},
"billy": {
"side": 2,
"loc": 222
},
"joe": {
"side": 2,
"loc": 333
},
"bob": {
"side": 1,
"loc": 444
}
}
}
//Code
var side2 = [];
for (var key in rooms[room]) {
if (rooms[room].hasOwnProperty(key)) {
var obj = rooms[room][key];
for (var prop in obj) {
if (obj.hasOwnProperty(prop)) {
if(prop == 'loc') {
if(obj[prop] == 2) {
side2.push(key);
}
}
}
}
}
}
console.log(side2);
答案 0 :(得分:1)
您希望在side
值为2
时推送,因此您要检查side
而不是loc
。然后,您只需按obj.loc
...
if (obj.hasOwnProperty(prop)) {
if(prop == 'side') {
if(obj[prop] == 2) {
side2.push(obj.loc);
}
}
}
...
话虽如此,你可以简单地缩短这段代码,删除不需要的循环,并且你可以简单地将所有代码缩短为:
for (var key in rooms[room]) {
var item = rooms[room][key];
if(item.side == 2)
side2.push(item.loc)
}
答案 1 :(得分:0)
如果loc
属性的值为2,则从您的语句中,您希望将side2
属性的值推送到数组side
。
但是在你的代码中
if(prop == 'loc') {
if(obj[prop] == 2) {
side2.push(key);
}
}
您正在将loc
属性的值比较为2,而不是side
属性的值。你可能需要像
if(prop == 'side') {
if(obj[prop] == 2) {
side2.push(obj['loc']);
}
}
答案 2 :(得分:0)
正如评论和其他答案中所述,您正在寻找loc
2
的{{1}}属性,该属性不存在。因此,可以通过将loc
替换为side
来解决当前问题(假设这是您想要的)。
但您的代码可以简化。在顶层循环很好。但是,代码的整个嵌套循环部分:
for (var prop in obj) {
if (obj.hasOwnProperty(prop)) {
if(prop == 'loc') {
if(obj[prop] == 2) {
side2.push(key);
}
}
}
}
可以替换为
if (obj.side == 2) side2.push(key);
换句话说,您不需要遍历对象的属性来查找特定的属性(在这种情况下为side
)。您只需obj.side
即可访问它。
您还可以将此问题设想为想要将房间列表过滤到那些loc
为2的人,在这种情况下您可以写:
Object.keys(rooms) . filter(hasPeopleWithLoc(2))
,其中
function hasPeopleWithLoc(loc) {
return function(roomKey) {
var room = rooms[roomKey];
return Object.keys(room) . some(function(personKey) {
return room[personKey].loc === loc;
});
};
}
请注意,如果该会议室中的任何人的loc
为{2},则此代码只会为结果中的一个会议室留下一个条目。原始代码的行为略有不同;它为该会议室中每个人员提供了所需loc
的结果。