Переименование объектных ключей в декартовом выводе - PullRequest
0 голосов
/ 14 марта 2019

Извините за неправильный заголовок вопроса, не могу найти лучшего.

У меня есть этот массив параметров:

const options = [
  {
    display_name: "Size",
    _id: "1",
    values: [
      {
        label: "Small",
        _id: "1"
      },
      {
        label: "Extra Large",
        _id: "2"
      }
    ]
  },
  {
    display_name: "Colors",
    _id: "2",
    values: [
      {
        label: "Red",
        value: "#ff0000",
        _id: "3"
      },
      {
        label: "Green",
        value: "#00ff21",
        _id: "4"
      },
    ]
  }
];

Я запускаю эту функцию для нее, чтобы получить Cartesian Product:

const getCartesian = object => {
  return Object.entries(object).reduce(
    (r, [key, value]) => {
      let temp = [];
      r.forEach(s =>
        (Array.isArray(value) ? value : [value]).forEach(w =>
          (w && typeof w === "object" ? getCartesian(w) : [w]).forEach(x =>
            temp.push(Object.assign({}, s, { [key]: x }))
          )
        )
      );
      return temp;
    },
    [{}]
  );
};

Это приведет к массивуобъекты в следующем формате (вывод console.log):


[{0: Object, 1: Object}, {0: Object, 1: Object}, ...]

Требуемый вывод:

[
            {
               "option":{
                  "id":1,
                  "display_name":"Size"
               },
               "value":{
                  "label":"Small",
                  "id": 1
               }
            },
            {
               "option":{
                  "id":2,
                  "display_name":"Color",
               },
               "value":{
                  "id":5,
                  "label":"Red"
               }
            }
...
]

вот игровая площадка и то, что я пробовал до сих пор: https://codesandbox.io/s/8nvwm76nnj

Ответы [ 2 ]

1 голос
/ 14 марта 2019

Вы можете заключить массив в объект со свойством option.Позже вы получите массив с объектами с ключом option для декартового произведения.

const getCartesian = object => {
    return Object.entries(object).reduce(
        (r, [key, value]) => {
            let temp = [];
            r.forEach(s =>
                (Array.isArray(value) ? value : [value]).forEach(w =>
                    (w && typeof w === "object" ? getCartesian(w) : [w]).forEach(x =>
                        temp.push(Object.assign({}, s, { [key]: x }))
                    )
                )
            );
            return temp;
        },
        [{}]
    );
};
const options = [{ display_name: "Size", _id: "1", values: [{ label: "Small", _id: "1" }, { label: "Extra Large", _id: "2" }] }, { display_name: "Colors", _id: "2", values: [{ label: "Red", value: "#ff0000", _id: "3" }, { label: "Green", value: "#00ff21", _id: "4" }] }];

console.log(getCartesian({ option: options }));
.as-console-wrapper { max-height: 100% !important; top: 0; }
1 голос
/ 14 марта 2019

Вам нужно map() в конце, чтобы преобразовать массив в объект.

const options = [
  {
    display_name: "Size",
    _id: "1",
    values: [
      {
        label: "Small",
        _id: "1"
      },
      {
        label: "Extra Large",
        _id: "2"
      }
    ]
  },
  {
    display_name: "Colors",
    _id: "2",
    values: [
      {
        label: "Red",
        value: "#ff0000",
        _id: "3"
      },
      {
        label: "Green",
        value: "#00ff21",
        _id: "4"
      },
    ]
  }
];

const getCartesian = object => {
      let t = Object.entries(object).reduce(
        (r, [key, value]) => {
          let temp = [];
          r.forEach(s =>
            (Array.isArray(value) ? value : [value]).forEach(w =>
              (w && typeof w === "object" ? getCartesian(w) : [w]).forEach(x =>
                temp.push(Object.assign({}, s, { [key]: x }))
              )
            )
          );
          return temp;
        },
        [{}]
      );
      return t.map(({0:val1,1:val2}) => ({option:val1,arr:val2}))
    };
console.log(getCartesian(options));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...