更简洁的方法来按值过滤包含其他对象的对象

时间:2011-09-29 12:17:45

标签: javascript

我有一个看起来像这样的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;

有更简洁的方式吗?这不是完全可读的代码!

4 个答案:

答案 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"]
    }
}
*/

查看working example on jsFiddle