2015-12-23 9 views
0

мне приходится писать многоКаков наилучший способ перебора фильтрованного набора свойств объекта в JavaScript?

for (var prop in obj) 
{ 
    if (condition(prop)) 
    { 
     // ... 
    } 
} 

-типа разделов в моем рабочем коде. Ниже приведены несколько примеров, непосредственно скопированных.

(1)

for (var region in this.DealsByRegion) // iterate through regions 
    { 
     if (this.RegionsChecked[region] === true) // if region is checked in table 
     { 
      num_deal_opportunities += region.NumOpportunities; 
      total_deal_percentage += region[dealName] * region.NumOpportunities; 
     }  

    } 

(2)

for (var deal_name in this.DealsChecked) 
{ 
    if (this.DealsChecked[deal_name] === true) 
    { 
     offer_data.push({ value: deal_percentages[deal_name], 
          color: this.ColorStack[(this.ColorStack.length + i) % this.ColorStack], 
          highlight: this.HighlightColor, 
          label: deal_name }); 
    }  
} 

и, конечно, много случаев

for (var thisguy in theseguys) 
{ 
    if (theseguys.hasOwnProperty(thisguy) 
    { 
    // ... 
    } 
} 

мне интересно, если есть способ сделать это более изящным и компактный. Я попытался написания LINQ-как ИНЕКЕ

// helper function for iterating through a filtered set of properties 
Object.prototype.PropsWhere = function (cond) 
{ 
    var propsWhere = []; 
    for (var prop in this) 
    { 
     if (cond(prop)) 
     { 
      propsWhere.push(prop); 
     } 
    } 
    return propsWhere; 
} 

, но когда я попытался использовать его, я понял, что это на самом деле сделал все менее компактный и читаемым и, конечно, я должен тогда иметь дело с новым this и болтовня-болтовня.

Как я должен приближаться к этим ситуациям?

+0

То, что вы делаете, кажется прекрасным, все остальное, вероятно, просто усложнит его, например 'Object.keys (this.DealsByRegion) .filter (Number) .forEach (function() {...' и т. Д. – adeneo

+0

Являются ли ' объекты и массивы этого.DealsByRegion' и 'this.DealsChecked'? – jfriend00

+0

@adeneo beware,' [0, 1, 2] .filter (Number); // [1, 2] ' –

ответ

1

Если вы обнаружили, что вам нужно написать множество условных операторов, которые перебирают свойства ваших объектов, вы можете пересмотреть свою схему.

Используя ваш пример регионы:

for (var region in RegionsChecked) // iterate through checked regions 
{ 
    num_deal_opportunities += region.NumOpportunities; 
    total_deal_percentage += region[dealName] * region.NumOpportunities; 
} 

Таким образом, ваши контейнеры содержат только ссылки на объекты, которые вам небезразличны - вместо того чтобы создавать «мета-контейнеры», которые говорят вам идентификатор объектов, которые вы заботитесь о ,

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

Другим подходом было бы пометить сами объекты «проверенным» свойством/полем. Но я предполагаю, что вы не хотите загрязнять свои объекты чем-то временным, как в настоящее время они проверяются или нет.

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