我有一个看起来像这样的JavaScript对象:
var options = {
'user1' : { 'house1' : ["lat1", "lng1"] },
'user2' : { 'house2' : ["lat2", "lng2"] },
'user3' : { 'house1' : ["lat3", "lng3"] }
};
假设我想查找与house1
关联的所有用户,并返回其用户名及其位置的数组。
最清楚,最有效的方法是什么?
目前我写了一个相当笨拙的自定义查找,如下所示:
function returnByValues(options, housenum):
var results = [];
for (var username in options) {
var properties = options[username];
for (var housekey in properties) {
if (housekey === housenum) {
var result = {};
result[username] = properties;
results.push(result);
}
}
}
return results;
有更简洁的方式吗?这不是完全可读的代码!
答案 0 :(得分:1)
我认为你不需要中间循环,假设每个用户只根据你的例子与一个房子相关联。所以:
function returnByValues(options, housenum):
var results = [];
for (var username in options) {
var properties = options[username];
if (housenum in properties) {
var result = {};
result[username] = properties;
results.push(result);
}
}
return results;
}
您通常不会看到if (housenum in properties)
语法,但它更优雅地等同于if (properties[housenum] != undefined)
。
顺便说一下,你的代码:
result[username] = properties;
给result == {"user1" : { 'house1' : [lat, lng] } }
- 这是你的意图吗?因为你对你想要的东西的描述是“他们的用户名及其位置的一系列”,我将把它当作:
result[username] = properties[housenum];
给予result == {"user1" : [lat, lng] }
答案 1 :(得分:0)
我猜你是这样搜索的: filteredArray = array.filter(... return a.xyz == b.xyz)
如果是这样,请看一下:http://www.tutorialspoint.com/javascript/array_filter.htm
答案 2 :(得分:0)
function returnByValues(options, housenum){
var results = [];
for (var username in options)
if(housenum in options[username])
results.push(function(){
var obj={};
obj[username] = options[username];
return obj;
});
return results;
}
答案 3 :(得分:0)
如果你想使用linq.js,你可以按照
的方式做function returnByValues(users, house) {
return Enumerable.From(users).Where("'" + house + "' in $.Value")
.ToObject("$.Key", "$.Value");
}
这个
var searchResult = returnByValues(options, "house1");
/* yields:
{
"user1": {
"house1": ["lat1", "lng1"]
},
"user3": {
"house1": ["lat3", "lng3"]
}
}
*/