Дети могут родиться в одном и том же городе, поэтому find()
не особенно подходит для этой проблемы, поскольку возвращает только первый результат, который ищет. В этом случае filter()
- это функция, которая нам нужна.
Ниже мы называем filter
внутри из reduce()
. Это отличается от другого ответа, поскольку не повторяет ваши входные данные более одного раза. Другой ответ сначала создаст целый массив дочерних элементов, затем во второй итерации выберите те, которые соответствуют вашему запросу по городу.
Кроме того, этот ответ повторяется по каждому президенту один раз и добавляет всех подходящих потомков к результату по пути.
const findByCity = (city, data = {}) =>
data .reduce
( (result, { children = [] }) =>
result .concat (children .filter (c => c.city === city))
, []
)
В ваших входных данных каждый ребенок имеет уникальный город, поэтому он не дает хорошей демонстрации. Я добавил еще нескольких детей, родившихся в city5
, чтобы мы могли увидеть ответ, включающий нескольких детей
const data =
[ { name: 'Trump'
, children:
[ { name: 'Trump Child 1', city: 'city1' }
, { name: 'Trump Child 2', city: 'city2' }
]
}
, { name: 'Barack Obama'
, children:
[ { name: 'Barack Obama Child 1', city: 'city3' }
, { name: 'Barack Obama Child 2', city: 'city4' }
]
}
, { name: 'Clinton'
, children:
[ { name: 'Clinton Child 1', city: 'city5' }
, { name: 'Clinton Child 2', city: 'city6' }
]
}
, { name: 'Bush'
, children:
[ { name: 'Bush Child 1', city: 'city5' }
, { name: 'Bush Child 2', city: 'city5' }
]
}
]
console .log (findByCity ('city1', data))
// [ { name: 'Trump Child 1', city: 'city1' } ]
console .log (findByCity ('city5', data))
// [ { name: 'Clinton Child 1', city: 'city5' }
// , { name: 'Bush Child 1', city: 'city5' }
// , { name: 'Bush Child 2', city: 'city5' }
// ]
Другой ответ, приведенный здесь, сломался бы, если бы в ваших данных содержался президент без children
. findByCity
не страдает от этой проблемы
const data =
[ // ...
, { name: 'Bush'
, children:
[ { name: 'Bush Child 1', city: 'city5' }
, { name: 'Bush Child 2', city: 'city5' }
]
}
// watch out for child-less presidents!
, { name: 'Polk' }
]
Разверните программу ниже, чтобы запустить ее в вашем браузере
const findByCity = (city, data = {}) =>
data .reduce
( (result, { children = [] }) =>
result .concat (children .filter (c => c.city === city))
, []
)
const data =
[ { name: 'Trump'
, children:
[ { name: 'Trump Child 1', city: 'city1' }
, { name: 'Trump Child 2', city: 'city2' }
]
}
, { name: 'Barack Obama'
, children:
[ { name: 'Barack Obama Child 1', city: 'city3' }
, { name: 'Barack Obama Child 2', city: 'city4' }
]
}
, { name: 'Clinton'
, children:
[ { name: 'Clinton Child 1', city: 'city5' }
, { name: 'Clinton Child 2', city: 'city6' }
]
}
, { name: 'Bush'
, children:
[ { name: 'Bush Child 1', city: 'city5' }
, { name: 'Bush Child 2', city: 'city5' }
]
}
, { name: 'Polk' }
]
console .log (findByCity ('city1', data))
// [ { name: 'Trump Child 1', city: 'city1' } ]
console .log (findByCity ('city5', data))
// [ { name: 'Clinton Child 1', city: 'city5' }
// , { name: 'Bush Child 1', city: 'city5' }
// , { name: 'Bush Child 2', city: 'city5' }
// ]