Создать массив объектов в соответствии с изменением количества свойств - PullRequest
0 голосов
/ 31 декабря 2018

Я хочу обработать массив в соответствии с количеством свойств для категории.

Я создал массив (array_a), используя доступные свойства, и я группирую это значение массива в соответствии со свойствами (array_colors, array_sizes),например, теперь у меня есть два массива 'array_colors' и 'array_sizes', поэтому в моем коде я зациклил их и создал массив объектов (array_b).но моя проблема в том, что я хочу обработать динамическое число свойств.

var array_a = [
   {
  "color":{
     "id":2,
     "name":"Green"
   }
   },
   {
  "color":{
     "id":3,
     "name":"Yellow"
   }
   },
   {
  "size":{
     "id":5,
     "name":"16"
   }
   },
   {
  "size":{
     "id":6,
     "name":"17"
   }
   },
   {
  "size":{
     "id":7,
     "name":"18"
  }
  }
];
array_colors = array_a.filter(function(myObject) {
    return myObject.hasOwnProperty('color');
  });

array_sizes = array_a.filter(function(myObject) {
 return myObject.hasOwnProperty('size');
 });

array_b = [];

for(var i = 0; i < array_colors.length; i++) {
for (var j = 0; j < array_sizes.length; j++) {
array_b.push( {
  "is_available":true,
  "qty":0,
  "price":0,
  "color":array_colors[i],
  "size":array_sizes[j]
});
}
}


array_b = [  
  {  
  "is_available":true,
  "qty":0,
  "price":0,
  "color":{  
     "id":2,
     "name":"Green"
      },
  "size":{  
     "id":5,
     "name":"16",
     "text":"16"
      }
   },
   {  
  "is_available":true,
  "qty":0,
  "price":0,
  "color":{  
     "id":2,
     "name":"Green"
      },
  "size":{  
     "id":6,
     "name":"17",
     "text":"17"
      }
   },
   {  
  "is_available":true,
  "qty":0,
  "price":0,
  "color":{  
     "id":2,
     "name":"Green"
      },
  "size":{  
     "id":7,
     "name":"18",
     "text":"18"
      }
   },
   {  
  "is_available":true,
  "qty":0,
  "price":0,
  "color":{  
     "id":3,
     "name":"Yellow"
      },
  "size":{  
     "id":5,
     "name":"16",
     "text":"16"
      }
   },
   {  
  "is_available":true,
  "qty":0,
  "price":0,
  "color":{  
     "id":3,
     "name":"Yellow"
      },
  "size":{  
     "id":6,
     "name":"17",
     "text":"17"
       }
   },
   {  
  "is_available":true,
  "qty":0,
  "price":0,
  "color":{  
     "id":3,
     "name":"Yellow"
      },
  "size":{  
     "id":7,
     "name":"18",
     "text":"18"
      }
   }
]

мой ожидаемый массив, как указано выше. Я хочу обрабатывать такие свойства, как цвет, размер динамически.

1 Ответ

0 голосов
/ 31 декабря 2018

используя _.mergeWith(), вы можете объединить свойства в один объект с именами свойств в качестве ключей и массивом значений для каждого ключа.Затем уменьшает объект до массива объектов, используя _.flatMap() (или Array.flatMap():

const array_a = [{"color":{"id":2,"name":"Green"}},{"color":{"id":3,"name":"Yellow"}},{"size":{"id":5,"name":"16"}},{"size":{"id":6,"name":"17"}},{"size":{"id":7,"name":"18"}}];

const getAllCombinations = _.flow([
  arr => _.mergeWith({}, ...arr, (o, s) => _.isArray(o) ? [...o, s.name] : [s.name]),
  props => _.reduce(props, (r, values, k) =>
    _.isEmpty(r) ?
    values.map(v => ({
      is_available: true,
      qty: 0,
      price: 0,
      [k]: v,
    })) :
    _.flatMap(r, o => values.map(v => ({
      ...o,
      [k]: v
    }))), [])
]);



console.log(getAllCombinations(array_a));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
...