2016-11-02 2 views
0

Я едва использовал lodash, и я пытаюсь использовать его сейчас для простой задачи.Глубокий выбор массива с lodash

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

items представляет собой массив объектов, такие как следующие:

{ 
    id: ‘string’, 
    val_1: ‘string’, 
    val_2: ‘string’, 
    components: array of: { 
     val_3: ‘string’, 
     val_4: ‘string’, 
     types: array of strings 
    } 
} 

Я хочу, чтобы выбрать объект, компоненты которого массив содержит допустимых типов. Допустимые типы определяются мной в массиве из примерно 10 строк. Это мое решение:

var validTypes = [‘type1’,’type3’,’type5’]; 
var desired = _.find(items, (item) => { 
    var allowed = true; 
    _.forEach(item.components, (component) => { 
     // Remove valid types. What's left should be empty. 
     _.pullAll(component.types, validTypes); 
     allowed = allowed && _.isEmpty(component.types); 
    }) 
    return allowed; 
}); 

Как сказал мне интересно, как это может быть улучшено, я чувствую, что я не использую lodash правильно.

ответ

2

Прежде всего, _.pullAll мутировать ваши объекты и не должен использоваться.

Вместо этого вы можете использовать _.every и _.some, это остановит цикл, как только будет найдено недопустимое значение.

var validTypes = [‘type1’,’type3’,’type5’]; 
var desired = _.find(items, (item) => { 
    return _.every(item.components, (component) => { // all components must be valid 
     return _.isEmpty(_.difference(component.types, validTypes)); // there shouldn't be any types that are not in the valid 
    } 
} 
+1

Лично я думаю, что он читает проще, если вы замените '_.isEmpty()' логику: '_.every (component.types, тип => _.includes (validTypes, тип))' – Retsam

+0

Я согласен, но это может замедлить производительность. – Meir

+1

Если не указано иное, читаемость превосходит производительность, imo. (Хотя я не понимаю, почему это было бы менее результативным, чем '_.difference') – Retsam

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