Извлечение данных в ES6 - PullRequest
       6

Извлечение данных в ES6

0 голосов
/ 15 ноября 2018

У меня есть этот массив 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}]},
}

Как я могу вернуть массив следующих объектов, которые имеют все front , back , top и 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);

Ответы [ 3 ]

0 голосов
/ 15 ноября 2018

Вы можете 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.log(newArry)
0 голосов
/ 15 ноября 2018
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)
  )
)
0 голосов
/ 15 ноября 2018

Вы можете filter идентификаторы, чтобы 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.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...