Mam obiekt JavaScript, który wygląda tak:

var options = { 
    'user1' : { 'house1' : ["lat1", "lng1"] },
    'user2' : { 'house2' : ["lat2", "lng2"] },
    'user3' : { 'house1' : ["lat3", "lng3"] }
};

Powiedz, że chcę spojrzeć wszystkich użytkowników związanych z house1 i zwrócić szereg swoich nazw użytkowników i ich pozycji.

Jaki jest najczystszy i najbardziej skuteczny sposób na to?

Obecnie napisałem raczej nieporęczne wyszukiwanie niestandardowe w następujący sposób:

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;

Czy jest jakiś sposób? To nie jest dokładnie czytelny kod!

0
Richard 29 wrzesień 2011, 16:17

4 odpowiedzi

Najlepsza odpowiedź

Nie sądzę, że potrzebujesz środkowej pętli, zakładając, że każdy użytkownik jest związany tylko z jednym domem zgodnie z twoim przykładem. Więc:

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;
}

Często nie widzisz składni if (housenum in properties), ale jest bardziej elegancki ekwiwalent if (properties[housenum] != undefined).

Nawiasem mówiąc, Twój kod:

result[username] = properties;

Daje result == {"user1" : { 'house1' : [lat, lng] } } - Czy to twój zamiar? Ponieważ twój opis tego, co chcesz, był "tablicą swoich nazwisk i ich stanowisk", które miałbym być tym:

result[username] = properties[housenum];

Dając result == {"user1" : [lat, lng] }

1
nnnnnn 29 wrzesień 2011, 12:33

Myślę, że szukasz czegoś takiego: FilterArray = array.Filter (... Powrót A.xyz == B.XYZ)

Jeśli tak, spójrz na to: http://www.tutorialspoin.com/javascript/array_filter. HTM.

0
user880625 29 wrzesień 2011, 12:32
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;
}
0
gion_13 29 wrzesień 2011, 13:44

Jeśli chcesz użyć linq.js, możesz zrobić rzeczy wzdłuż linii

function returnByValues(users, house) {
  return Enumerable.From(users).Where("'" + house + "' in $.Value")
  .ToObject("$.Key", "$.Value");
}

Gdzie to

var searchResult = returnByValues(options, "house1");

/* yields:
{
    "user1": {
        "house1": ["lat1", "lng1"]
    },
    "user3": {
        "house1": ["lat3", "lng3"]
    }
}
*/

Spójrz na Przykład roboczy na JSFiddle.

0
Tomalak 1 październik 2011, 12:43