У меня есть этот массив const idArray = ["12", "231", "73", "4"] и объект
const blueprints = {
12: {color: red, views: [{name: "front}, {name: "back}, {name: "top}, {name: "bottom}]},
231: {color: white, views: [{name: "front}, {name: "back}]},
73: {color: black, views: [{name: "front}, {name: "back}, {name: "top}, {name: "bottom}]},
4: {color: silver, views: [{name: "front}, {name: "back}, {name: "top}, {name: "bottom}]},
}
Как я могу вернуть массив следующих объектов, которые имеют все фронт, назад, верхняя и Нижний, используя ES6 map/filter/some и т. д. ?:
result =[
{colorId: "12", views: [{name: "front}, {name: "back}, {name: "top}, {name: "bottom}]}
{colorId: "73", views: [{name: "front}, {name: "back}, {name: "top}, {name: "bottom}]}
{colorId: "4", views: [{name: "front}, {name: "back}, {name: "top}, {name: "bottom}]}
]
Я сделал это здесь, но мне кажется, что это слишком грязно и трудно читать. Кто-нибудь может порекомендовать, как его сократить и упростить чтение с помощью функций ES6 (карта, фильтр ...)?
const result = idArray.map(id => {
const bluePrint = bluePrints[id];
const exists = blurPrint.views.some(view => view.name === 'top' || view.name === 'bottom');
if (exists) {
return {
colorId: id,
views: bluePrint.views
}
}
}).filter(bluePrint => !bluePrint);
У вас много пропущенных кавычек в исходном массиве и желаемый результат.
Еще одна опечатка: blurPrint должен быть bluePrint
bluePrint => !bluePrint должен быть bluePrint => bluePrint, иначе вы получите просто массив undefined.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете filter ids, чтобы цвет every в вашем целевом наборе цветов находился в blueprint.views этого идентификатора, а затем map этих идентификаторов для вашего желаемого объекта результата:
const idArray = ["12", "231", "73", "4"];
const blueprints = {
12: {color: 'red', views: [{name: "front"}, {name: "back"}, {name: "top"}, {name: "bottom"}]},
231: {color: 'white', views: [{name: "front"}, {name: "back"}]},
73: {color: 'black', views: [{name: "front"}, {name: "back"}, {name: "top"}, {name: "bottom"}]},
4: {color: 'silver', views: [{name: "front"}, {name: "back"}, {name: "top"}, {name: "bottom"}]},
};
const result = idArray
.filter(id => {
const colors = blueprints[id].views.map(e => e.name);
return ['front', 'back', 'top', 'bottom'].every(s => colors.includes(s));
})
.map(id => ({colorId: id, views: blueprints[id].views}))
console.info(result);Вы можете map() поверх вашего idArray, чтобы создать массив в желаемом формате, затем использовать filter(), чтобы проверить, находится ли требуемая строка every() в массиве просмотра, и отфильтровать неполные элементы:
const blueprints = {
12: {color: "red", views: [{name: "front"}, {name: "back"}, {name: "top"}, {name: "bottom"}]},
231: {color: "white", views: [{name: "front"}, {name: "back"}]},
73: {color: "black", views: [{name: "front"}, {name: "back"}, {name: "top"}, {name: "bottom"}]},
4: {color: "silver", views: [{name: "front"}, {name: "back"}, {name: "top"}, {name: "bottom"}]},
}
const idArray = ["12", "231", "73", "4"]
const required = ['front', 'back', 'top', 'bottom']
let newArry = idArray
.map(colorID => ({colorID, views: blueprints[colorID].views }) )
.filter(item => required.every(direction => item.views.some(v => v.name == direction) ))
console.info(newArry)Object.keys(blueprints)
.map(k => ({colorId:k, views:blueprints[k].views}))
.filter(el =>
['front', 'back', 'top', 'bottom'].every(it =>
el.views.some(s => s.name === it)
)
)
Вопросы о том, как оптимизировать рабочий код, лучше задавать на codereview.stackexchange.com. Вы можете использовать один
reduce()вместо цепочкиmap()иfilter().