JavaScript конвертирует объект с определенной структурой в массивы - PullRequest
0 голосов
/ 30 августа 2018

Ожидаемый ввод:

const all = [
       {  "Attribute_Values" : [ "36", "38", "40" ],
          "Attribute" : "size"
       }, 
       {  "Attribute_Values" : [ "blue", "black" ],
          "Attribute" : "color"
       }
    ];

Ожидаемый результат:

[ {size: '36', color: 'blue'},
  {size: '36', color: 'black'},
  {size: '38', color: 'blue'},
  {size: '38', color: 'black'}, 
  {size: '40', color: 'blue'},
  {size: '40', color: 'black'} ]

Ответы [ 3 ]

0 голосов
/ 30 августа 2018

Сначала сгенерируйте объект с требуемыми ключами и значениями, затем возьмите рекурсивную функцию, которая разделяет все пары ключ / значение и создайте новый декартовой продукт путем итерации значений, если массив с объектами снова вызывает getCartesian и создает новые объекты .

Это работает и для вложенных объектов.

function getCartesian(object) {
    return Object.entries(object).reduce((r, [k, v]) => {
        var temp = [];
        r.forEach(s =>
            (Array.isArray(v) ? v : [v]).forEach(w =>
                (w && typeof w === 'object' ? getCartesian(w) : [w]).forEach(x =>
                    temp.push(Object.assign({}, s, { [k]: x }))
                )
            )
        );
        return temp;
    }, [{}]);
}

var all = [{ Attribute_Values: ["36", "38", "40"], Attribute: "size" }, { Attribute_Values: ["blue", "black"], Attribute: "color" }],
    temp = Object.assign(...all.map(({ Attribute_Values, Attribute }) => ({ [Attribute]: Attribute_Values }))),
    cartesian = getCartesian(temp);

console.log(temp);
console.log(cartesian);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 30 августа 2018

Я бы пошел с декартовым генератором продуктов, который принимает значения атрибутов, и при заполнении результата считывал имя атрибута из текущей позиции продуктов. Генератор взят от здесь

const all = [
       {  "Attribute_Values" : [ "36", "38", "40" ],
          "Attribute" : "size"
       }, 
       {  "Attribute_Values" : [ "blue", "black" ],
          "Attribute" : "color"
       }
    ];

// Cartesian generator - copied from https://stackoverflow.com/a/44012184/3820185
function* cartesian(head, ...tail) {
  const remainder = tail.length > 0 ? cartesian(...tail) : [[]];
  for (let r of remainder) for (let h of head) yield [h, ...r];
}

let result = [], part, product, i;

for(product of cartesian(...all.map(i => i.Attribute_Values))) {
  part = {};
  for(i = 0; i < product.length; i++) part[all[i].Attribute] = product[i];
  result.push(part);
}

console.log(result);
0 голосов
/ 30 августа 2018

Вы можете перебирать массив размеров, а затем комбинировать каждый размер с каждым цветом, перебирая массив цветов.

const all = [
       {  "Attribute_Values" : [ "36", "38", "40" ],
          "Attribute" : "size"
       }, 
       {  "Attribute_Values" : [ "blue", "black" ],
          "Attribute" : "color"
       }
    ];
    
 let results = [];
 
all[0].Attribute_Values.forEach(size => {
  all[1].Attribute_Values.forEach(color => {
    results.push({size: size, color: color});
   });
});

console.log(results);
 
 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...