2013-11-10 5 views
3

Есть ли короткий и опрятный способ найти товар в нижеследующем списке с данным searchObject?Сравнение нескольких полей в javascript

var list = [ 
    { id:1, name: "foo", description: "description 1" }, 
    { id:2, name: "bar", description: "description 2" }, 
    { id:3, name: "baz", description: "description 3" }, 
]; 

var searchObject = { id: 2, name: "bar" }; 

searchObject делает НЕ обязательно иметь все свойства элемента в списке. Мне нужен оператор между свойствами: И (id == 2 & & имя == "бар"). Следующее - это то, что я придумал. Есть ли что-нибудь родное в javascript, которое может это сделать?

for (var i in list) { 
    var found = true; 
    for (var p in searchObject) { 
     if (list[i][p] !== searchObject[p]) { 
      found = false; 
      break; 
     } 
    } 
    if(found) return list[i]; 
} 
+0

Пожалуйста, не используйте 'для (х в у)' на массивах. [Это НЕ делает то, что вы думаете] (http://stackoverflow.com/a/500531/36866) – some

ответ

0

Из моего опыта, если решение когда-либо существует, оно не будет намного лучше вашего.

Лучше не использовать оператор for...in для массивов, поскольку он перечисляет свойства массива, а не элементы. Рассмотрим следующий пример:

Array.prototype.test = function() { }; 
for (var i in q) console.log(i); 

Этот код выведет на экран test, который, вероятно, не то, что вы можете ожидать.

В любом случае, для таких вещей я использую lo-dash. Его метод _.find(...) делает именно то, что вам нужно, и вы можете посмотреть исходный код этого метода, который, как я полагаю, является наиболее эффективной реализацией.

3

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

var matches = list.filter(function(arrElem){ 
    return Object.keys(searchObject).every(function(prop){ 
     return searchObject[prop] === arrElem[prop]; 
    }); 
}); 

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

пс, многие из них «Я желаю, чтобы у меня был лучший способ сделать Х», удовлетворены underscore.js. В частности, метод findWhere является то, что вы после:

var match = _.findWhere(list, searchObject); 
+0

Под «javascripty» вы подразумеваете функциональность? –

+0

@ChristopherHarris kinda ... возможно больше похоже на подчеркивание javascripts уникального сочетания императивных OO с функциональными идеями. – goat

Смежные вопросы