Фильтрация массива объектов путем поиска свойства вложенного объекта - PullRequest
0 голосов
/ 16 мая 2019

У меня есть 1 массив объектов (с именем childrenArray) примерно так:

[
  {name:'somevalue',favColors:['red','purple','green']},
  {name:'somevalue1',favColors:['blue','brown','pink]},
  {name:'somevalue2',favColors:['orange','yellow']}
]

И объект со следующими свойствами:

{colorBook:'somevalue4', colors:['red','blue']}

По сути, я хочу отфильтровать массив объектов, чтобы вернуть объекты, которые имеют общие свойства цвета с моим объектом.

Таким образом, поиск свойства colors приведет к

{name:'somevalue',favColors:['red','purple','green']},
{name:'somevalue1',favColors:['blue','brown','pink]},

Что я пробовал до сих пор:

 getElementsByColors(colors: string[]){
     return _.filter(this.childrenArray, function(child) {
        child.favColors.find( color => color === colors.forEach(c => c)}

Ответы [ 2 ]

0 голосов
/ 16 мая 2019

В lodash это будет выглядеть очень похоже на использование .Some , .filter и _. Включает в себя :

const data = [ {name:'somevalue',favColors:['red','purple','green']}, {name:'somevalue1',favColors:['blue','brown','pink']}, {name:'somevalue2',favColors:['orange','purple', 'green']} ]
const filter1 = {colorBook:'somevalue4', colors:['red','blue']}
const filter2 = {colorBook:'somevalue4', colors:['purple','green']}

let matchSomeColors = (d, f) => 
  _.filter(d, ({favColors}) => _.some(f.colors, c => _.includes(favColors, c)))

let matchEveryColor = (d, f) => 
  _.filter(d, ({favColors}) => _.every(f.colors, c => _.includes(favColors, c)))

console.log('some: ', matchSomeColors(data, filter1))
console.log('every: ', matchEveryColor(data, filter2))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

Я также добавил _. Каждые , чтобы вы могли увидеть разницу. Но если вам нужно использовать lodash только для этого, то лучше всего делать это с простым JS и т. Д.

0 голосов
/ 16 мая 2019

Вы можете отфильтровать childrenArray, проверив с помощью Array.some(), содержит ли он хотя бы один цвет (или каждый для всех), и Array.includes():

const childrenArray = [
  {name:'somevalue',favColors:['red','purple','green']},
  {name:'somevalue1',favColors:['blue','brown','pink']},
  {name:'somevalue2',favColors:['orange','yellow']}
]

const getElementsByColors = ({ colors }) =>
  childrenArray.filter(({ favColors }) =>
    colors.some(color => favColors.includes(color)) // or every for all of them
  )

const result = getElementsByColors({colorBook:'somevalue4', colors:['red','blue']})

console.log(result)
...