Поиск объекта JS для значения - PullRequest
4 голосов
/ 27 сентября 2011

Скажите, у меня есть объект:

userInfo

И я хочу найти каждый узел userInfo, чтобы узнать, имеет ли ключ 'username' значение, равное foo.

userInfo[x].username == "foo" 

Есть ли лучший способ сделать следующее?

var matchFound = false;

for (var i = 0, len = userInfo.length; i < len; i++)
     matchFound = userInfo[i].username == "foo";

Ответы [ 3 ]

4 голосов
/ 27 сентября 2011

Нет лучшего (более эффективного) способа без введения другой структуры данных.Ответ на самом деле зависит от вашего использования, но вы можете сделать несколько разных вещей:

  1. Создать отдельные «индексы», используя хэши.Эти структуры будут сопоставлять ключи с элементами или индексом в исходном массиве.Объекты / хэши JavaScript поддерживают поиск на основе ключей и должны быть эффективными.

    userinfo[x].username = "foo";
    // Index the objects
    usersByName = {};
    usersByName["foo"] = userinfo[x];
    // -- OR -- index the array indices
    var usersByName["foo"] = x;
    // Test for key
    "foo" in usersByName; // true
    

    Вам придется проделать еще немного работы, чтобы сохранить согласованность между индексом и исходным массивом.Вероятно, лучше всего обернуть оба объекта в другой, чтобы управлять содержимым обоих.Этот подход хорош, если есть несколько полей, по которым вы хотите искать объекты.

  2. Если вам не важен порядок коллекции, вы можете просто изменить все это нахэш и индекс по имени пользователя

    var userinfo = {};
    userinfo["foo"] = {username: "foo", firstName: "Foo", lastName: "Bar"};
    

Однако стоит задуматься о том, не приведет ли выигрыш в эффективности к увеличению сложности кода, связанной с поддержанием индексов.Если вы не выполняете много поисков и у вас нет тонны элементов в коллекции userinfo, возможно, имеет смысл написать простую функцию поиска или использовать библиотеку, подобную той, о которой говорил Филипп Швайгер.

function findObjectByAttribute (items, attribute, value) {
  for (var i = 0; i < items.length; i++) {
    if (items[i][attribute] === value) {
      return items[i];
    }
  }
  return null;
}
var userinfo = [];
userinfo[0] = {username: "foo"};
console.log(findObjectByAttribute(userinfo, "username", "foo"));
3 голосов
/ 27 сентября 2011

Нет необходимости в троичном операторе, учтите следующее:

var matchFound = false;

for (var i = 0, len = userInfo.length; i < len; i++)
{
    matchFound = userInfo[i].username == "foo";
    if(matchFound){
        break;
    }
}  
1 голос
/ 27 сентября 2011

Библиотека подчеркивания JS имеет несколько удобных методов для работы со сборами данных - например, метод выбора

Реализация этого будет выглядеть так:

var userInfo = {
    'x':{
        username: "foo",
        password:'dlji'
    },
    'y':{
        username: "bar" ,
        password:'adfasf'
    },
    'z': {
        username: 'foo',
        password:'d3alj4i'
    }
};

var found = _.select(userInfo, function(node){

    return node.username === "foo"
}); 
console.dir (found);

Подчеркивание не очень велико, и, хотя вы можете сделать это и на нативном JS, я думаю, что оно хорошо справляется с реализацией решений, которые вы придумали самостоятельно.По сути, он предоставляет вам множество функций JS, которые, как вы думаете, должны быть в любом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...